如何在ServiceStack OrmLite中加入2个表并选择这两个类?

EM0*_*EM0 5 ormlite-servicestack

我想在ServiceStack OrmLite中进行一个简单的SQL连接,并将两个表作为相应的.NET对象.

在LINQ-to-Entities中,它将是这样的:

Claim.Join(Policy, c => c.PolicyId, p => p.Id, (c, p) => new { Claim = c, Policy = p })
Run Code Online (Sandbox Code Playgroud)

这会给我一个匿名类型ClaimPolicy属性.

我查看了OrmLite 高级连接示例,但只选择了每种类型的一些属性为第3类对象(FullCustomerInfo).我不想在另一个对象中重复我的所有属性,我只想使用现有的对象.

实际上,查询可能要复杂得多,例如

Claim.Join(Policy, c => c.PolicyId, p => p.Id, (c, p) => new { Claim = c, Policy = p })
    .Where(o => o.Policy.Something > o.Claim.Something)
    .Select(o => o.Claim.SomethingElse)
Run Code Online (Sandbox Code Playgroud)

...等等,但即使OrmLite可以在SQL中进行连接,我也必须在内存中完成剩下的工作,这将是一个良好的开端.

myt*_*thz 10

这不是提供OrmLite之前,但因为它是一个很好的功能我刚刚添加了支持SelectMulti<T,T2,..>,并SelectMultiAsync 在这个承诺现在,您可以从单个查询读取到你连接的表7.

因此,要使用OrmLite的高级连接示例,您可以使用以下命令构造类型化的连接查询:

var q = db.From<Customer>()
    .Join<Customer, CustomerAddress>()
    .Join<Customer, Order>();
Run Code Online (Sandbox Code Playgroud)

然后使用SelectMultiAPI填充您感兴趣的表,例如:

var results = db.SelectMulti<Customer, CustomerAddress, Order>(q);
Run Code Online (Sandbox Code Playgroud)

这将返回一个List<Tuple<T,T2,T3>>允许您从已加入查询中的表中键入对已填充POCO的访问权限.

如果愿意,还有一个异步版本:

var results = await db.SelectMultiAsync<Customer, CustomerAddress, Order>(q);
Run Code Online (Sandbox Code Playgroud)

新的SelectMultiAPI可从v4.0.57获得,现在可在MyGet上使用.

在OrmLite中创建类型化查询并在Dapper中执行它们

另一种方法是使用OrmLite的组合来使用其内置的参考约定创建类型化查询,然后使用OrmLite的嵌入式版本的Dapper将多个结果集查询到现有的POCO类型中.

首先创建您的Typed Query Expression并让它返回所有表中的所有字段:

var q = db.From<Customer>()
    .Join<Customer, CustomerAddress>()
    .Join<Customer, Order>()
    .Select("*");
Run Code Online (Sandbox Code Playgroud)

然后将生成的SQL从上面输入的SQL表达式传递到Dapper的Query Multiple功能,将结果读入不同连接表的元组列表:

using (var multi = db.QueryMultiple(q.ToSelectStatement()))
{
    var results = multi.Read<Customer, CustomerAddress, Order, 
        Tuple<Customer,CustomerAddress,Order>>(Tuple.Create).ToList();

    foreach (var tuple in results)
    {
        "Customer:".Print();
        tuple.Item1.PrintDump();

        "Customer Address:".Print();
        tuple.Item2.PrintDump();

        "Order:".Print();
        tuple.Item3.PrintDump();
    }
}
Run Code Online (Sandbox Code Playgroud)

其中印有以下内容:

Customer:
{
    Id: 1,
    Name: Customer 1
}
Customer Address:
{
    Id: 1,
    CustomerId: 1,
    AddressLine1: 1 Australia Street,
}
Order:
{
    Id: 1,
    CustomerId: 1,
    LineItem: Line 1,
    Qty: 1,
    Cost: 1.99
}    
Customer:
{
    Id: 1,
    Name: Customer 1
}
Customer Address:
{
    Id: 1,
    CustomerId: 1,
    AddressLine1: 1 Australia Street,
}
Order:
{
    Id: 2,
    CustomerId: 1,
    LineItem: Line 2,
    Qty: 2,
    Cost: 2.99
}
Run Code Online (Sandbox Code Playgroud)

  • “不,没有办法,但是是的,现在有了”——这就是答案!:D 非常感谢。 (2认同)