specimen
specimen

Reputation: 1765

Can AutoQuery return a single item (not list)

When I add a type to AutoQuery, with:

[Route("/templates")]
public class SearchTemplates : QueryDb<Template>
{
    public int? Id { get; set; }
    public string Name { get; set; }
}

then I can query this object by Id or Name (or whatever other attributes I would add, that the POCO Template has). However it always returns list of items.

It's very useful to be able to GET a single item (not a search result).

This is how I do it:

[Route("/template/{Id}","GET")]
public class SingleTemplate : IReturn<Template>
{
    public int Id { get; set; }
}

public Template Get(SingleTemplate request)
{
    return Db.LoadSingleById<Template>(request.Id); 
}

With all the new AutoQuery and AutoCRUD, it seems to me that the "return a single item by its URL" could also be automatic?

Upvotes: 2

Views: 98

Answers (1)

mythz
mythz

Reputation: 143349

No, All AutoQuery QueryDb<T> services return the same fixed QueryResponse Response DTO as per its Service Contract, i.e:

public abstract class QueryDb<T> 
    : QueryBase, IQueryDb<T>, IReturn<QueryResponse<T>> { }

public abstract class QueryDb<From, Into> 
    : QueryBase, IQueryDb<From, Into>, IReturn<QueryResponse<Into>> { }

public class QueryResponse<T> : IQueryResponse
{
    public virtual int Offset { get; set; }
    public virtual int Total { get; set; }
    public virtual List<T> Results { get; set; }
    public virtual Dictionary<string, string> Meta { get; set; }
    public virtual ResponseStatus ResponseStatus { get; set; }
}

A single result would still populate the Results property, so the JSON wire format would look like:

{ "results":[ {/*Template*/} ] }

You could create your own Custom AutoQuery Implementation that utilizes AutoQuery's IAutoQueryDb API to return your own custom populated DTO but then your Request DTO should NOT inherit from QueryDb<T> as not returning a QueryResponse<T> would break the explicit Service contract of the Request DTO (and all clients expecting it), i.e. you would instead just create a normal ServiceStack Service returning your own custom Response Type.

Upvotes: 1

Related Questions