ServiceStack ORMLite - 如何选择全部以自动匹配请求DTO的属性

时间:2014-08-28 20:43:16

标签: request servicestack where-clause dto ormlite-servicestack

我有几个ServiceStack ORMLite POCO,一个是下面的公司。

    public class Company
    {
        [AutoIncrement]
        public int id { get; set; }
        public string company { get; set; }
        public int? companyNo { get; set; }
        public bool? active { get; set; }
    }

如果以下请求中有两个属性有效:req.company =“ABC Company”,req.active = ture,所有其他属性为null。然后它可以返回与这两个属性匹配的所有记录。代码可能如下所示:

    public object Get(Company req)
    {
        return Db.Select<Company>().Where<Company>(req);
    }

ServiceStack ORMLite是否有这样的WHRER来自动匹配请求DTO中的有效属性?

2 个答案:

答案 0 :(得分:0)

这不是OrmLite中的一项功能,但它可以在AutoQuery中使用,您只需要定义要查询的请求DTO,例如:

[Route("/company/search")]
public class QueryCompany : IQuery<Company>
{
    public int Id { get; set; }
    public string Company { get; set; }
    public int? CompanyNo { get; set; }
    public bool? Active { get; set; }
}

只需使用Request DTO,ServiceStack就会自动为您创建服务,您可以像任何其他服务一样进行查询。

启用AutoQuery

您可以通过注册AutoQuery功能启用AutoQuery,例如:

Plugins.Add(new AutoQueryFeature { MaxLimit = 100 });

ServiceStack.Server NuGet包中提供了AutoQuery:

PM> Install-Package ServiceStack.Server

答案 1 :(得分:0)

谢谢mythz。这个对我有用。我的代码如下:

// ====== Model.cs ========
[Route("/company/search")]
public class QueryableCompany : QueryBase<Company>
{
    public int? Id { get; set; }
    public string Company { get; set; }
    public int? CompanyNo { get; set; }
    public bool? Active { get; set; }
}
public class Company
{
    [AutoIncrement]
    public int id { get; set; }
    public string company { get; set; }
    public int companyNo { get; set; }
    public bool active { get; set; }
}
// ====== Service.cs ========
public IAutoQuery AutoQuery { get; set; }

public object Get(QueryableCompanies dto)
{
    var q = AutoQuery.CreateQuery(dto, Request.GetRequestParams());
    var r = AutoQuery.Execute(dto, q);
    return r.Results; 
}

// ====== Global.asax.cs ========
public override void Configure(Container container)
{
    //...
    Plugins.Add(new AutoQueryFeature { MaxLimit = 100 });
    //...
}

然后,根据上面的代码我还有两个问题。

1)由于我有很多请求DTO,他们在Get(QueryableXXX dto)中的代码都是一样的;如何使用单个通用Get()方法返回所有不同类型的DTO,如:

public object Get<T>(T dto) where T : IQuery
{
    var q = AutoQuery.CreateQuery(dto, Request.GetRequestParams());
    return AutoQuery.Execute(dto, q).Results;
}

2)在上面的公司示例中,类QueryableCompany看起来与类公司类似,AutoQuery是否可以为类公司的成员提供一些属性,并避免创建另一个类似的QueryableCompany?