我想在ServiceStack OrmLite中进行简单的SQL连接,并将两个表作为相应的.NET对象。
在LINQ-to-Entities中,它将是这样的:
Claim.Join(Policy, c => c.PolicyId, p => p.Id, (c, p) => new { Claim = c, Policy = p })
这会给我一个包含Claim
和Policy
属性的匿名类型。
我查看了OrmLite Advanced Join Example,但只选择了每种类型的某些属性为第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)
......等等,但即使OrmLite可以在SQL中进行连接,我也必须在内存中完成剩下的工作,这将是一个良好的开端。
答案 0 :(得分:10)
以前在OrmLite中没有这个功能,但是我很高兴能够添加对SelectMulti<T,T2,..>
和SelectMultiAsync
in this commit的支持。现在,您可以从一个查询中读取最多7个已连接的表。
因此,要使用OrmLite的高级连接示例,您可以使用以下命令构建类型化的连接查询:
var q = db.From<Customer>()
.Join<Customer, CustomerAddress>()
.Join<Customer, Order>();
然后使用SelectMulti
API填充您感兴趣的表格,例如:
var results = db.SelectMulti<Customer, CustomerAddress, Order>(q);
这将返回List<Tuple<T,T2,T3>>
,使您可以从已加入查询中的表格中对已填充的POCO进行输入。
如果愿意,还有异步版本:
var results = await db.SelectMultiAsync<Customer, CustomerAddress, Order>(q);
新的SelectMulti
API可从v4.0.57获得,现在是available on MyGet。
另一种方法是使用OrmLite的组合来使用其内置的Reference Conventions创建类型化查询,然后使用OrmLite的嵌入式版本的Dapper将多个结果集查询到现有的POCO类型中
首先创建您的Typed Query Expression并让它返回所有表中的所有字段:
var q = db.From<Customer>()
.Join<Customer, CustomerAddress>()
.Join<Customer, Order>()
.Select("*");
然后将生成的SQL从上面输入的SQL Expression传递到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();
}
}
打印出如下内容:
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
}