如何在 ServiceStack OrmLite 中连接 2 个表并且 select 都 类?
How do I join 2 tables in ServiceStack OrmLite and select both classes?
我想在 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,但它只选择了每种类型的一些属性到第三类对象中 (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 中进行连接,而我必须在内存中完成其余部分,这将是一个好的开始。
这在 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);
这将 return List<Tuple<T,T2,T3>>
让您从连接查询中的表中输入对填充的 POCO 的访问权限。
如果愿意,还有一个异步版本:
var results = await db.SelectMultiAsync<Customer, CustomerAddress, Order>(q);
新的 SelectMulti
API 从 v4.0.57 开始可用,现在是 available on MyGet。
在 OrmLite 中创建类型化查询并在 Dapper 中执行它们
另一种方法是使用 OrmLite 的组合,使用其内置 Reference Conventions 创建类型化查询,然后使用 OrmLite 的嵌入式 Dapper 版本将多个结果集查询到现有的 POCO 类型中。
首先创建您的类型化查询表达式并使其return所有表中的所有字段具有:
var q = db.From<Customer>()
.Join<Customer, CustomerAddress>()
.Join<Customer, Order>()
.Select("*");
然后将生成的 SQL 从上面键入的 SQL 表达式传递到 Dapper 的多查询功能中,以将结果读入不同连接表的元组列表:
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
}
我想在 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,但它只选择了每种类型的一些属性到第三类对象中 (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 中进行连接,而我必须在内存中完成其余部分,这将是一个好的开始。
这在 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);
这将 return List<Tuple<T,T2,T3>>
让您从连接查询中的表中输入对填充的 POCO 的访问权限。
如果愿意,还有一个异步版本:
var results = await db.SelectMultiAsync<Customer, CustomerAddress, Order>(q);
新的 SelectMulti
API 从 v4.0.57 开始可用,现在是 available on MyGet。
在 OrmLite 中创建类型化查询并在 Dapper 中执行它们
另一种方法是使用 OrmLite 的组合,使用其内置 Reference Conventions 创建类型化查询,然后使用 OrmLite 的嵌入式 Dapper 版本将多个结果集查询到现有的 POCO 类型中。
首先创建您的类型化查询表达式并使其return所有表中的所有字段具有:
var q = db.From<Customer>()
.Join<Customer, CustomerAddress>()
.Join<Customer, Order>()
.Select("*");
然后将生成的 SQL 从上面键入的 SQL 表达式传递到 Dapper 的多查询功能中,以将结果读入不同连接表的元组列表:
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
}