可以自动查询 return 单个项目(不是列表)

Can AutoQuery return a single item (not list)

当我向 AutoQuery 添加类型时,使用:

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

然后我可以通过 ID 或名称(或我要添加的 POCO 模板具有的任何其他属性)查询此对象。但是它总是 return 的项目列表。

能够获取单个项目(不是搜索结果)非常有用。

我是这样做的:

[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); 
}

有了所有新的 AutoQuery 和 AutoCRUD,在我看来,“return 单个项目 URL” 也可以是自动的?

否,所有 AutoQuery QueryDb<T> services return the same fixed QueryResponse Response DTO as per its Service Contract,即:

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; }
}

单个结果仍会填充 Results 属性,因此 JSON 线格式如下:

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

您可以创建自己的 Custom AutoQuery Implementation,它利用 AutoQuery 的 IAutoQueryDb API 到 return 您自己的自定义填充 DTO,但您的请求 DTO 应该 NOTQueryDb<T> 继承,因为 not returning a QueryResponse<T> 会破坏 Request DTO(以及所有期望它的客户)的显式服务合同,即您将改为创建一个普通的 ServiceStack 服务 return 使用您自己的自定义响应类型。