2

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

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

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

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

我就是这样做的:

[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,在我看来“通过 URL 返回单个项目”也可以是自动的?

4

1 回答 1

1

不,所有AutoQuery 服务根据其Service ContractQueryDb<T>返回相同的固定QueryResponse Response DTO,即:

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*/} ] }

您可以创建自己的自定义 AutoQuery 实现,该实现利用 AutoQuery 的IAutoQueryDbAPI 返回您自己的自定义填充 DTO,但是您的 Request DTO 不应继承QueryDb<T>因为不返回 aQueryResponse<T>会破坏 Request DTO 的显式服务合同(以及所有期望它的客户),即,您将改为创建一个普通的 ServiceStack 服务,返回您自己的自定义响应类型。

于 2021-05-12T12:59:55.770 回答