gpt4 book ai didi

ormlite-servicestack - 如何在ServiceStack OrmLite中联接2个表并选择两个类?

转载 作者:行者123 更新时间:2023-12-04 17:16:56 26 4
gpt4 key购买 nike

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

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

Claim.Join(Policy, c => c.PolicyId, p => p.Id, (c, p) => new { Claim = c, Policy = p })

这将为我提供具有 ClaimPolicy属性的匿名类型。

我看过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);

它将返回一个 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类型中。

首先创建您的类型化查询表达式,并使用以下命令返回所有表的所有字段:
var q = db.From<Customer>()
.Join<Customer, CustomerAddress>()
.Join<Customer, Order>()
.Select("*");

然后将从上面键入的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();
}
}

打印出类似以下内容的内容:
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
}

关于ormlite-servicestack - 如何在ServiceStack OrmLite中联接2个表并选择两个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37416424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com