gpt4 book ai didi

c# - 使用 LINQ 查询和创建具有一对多关系的对象

转载 作者:行者123 更新时间:2023-11-30 17:50:34 25 4
gpt4 key购买 nike

在数据库中,我有两个具有一对多关系的表:

orders          suborders
----------- -----------
id id
name order_id
name

我想查询这些表并得到一个订单对象列表,每个对象都包含一个子订单对象列表(或空列表)。我还想在单个数据库查询中执行此操作,以便它执行良好。

在传统的 SQL 查询领域,我会做类似的事情(请原谅伪代码):

rs = "select o.id, o.name, so.id, so.name from orders o left join suborders so on o.id = so.order_id order by o.id"

orders = new List<Order>
order = null
foreach (row in rs) {
if (order == null || row.get(o.id) != order.id) {
order = new Order(row.get(o.id), row.get(o.name), new List<Suborders>)
orders.add(order)
}

if (row.get(so.id) != null) {
order.suborders.add(new Suborder(row.get(so.id) row.get(so.name))
}
}

有没有办法使用 LINQ-to-Entities 获得相同的结果对象结构?请注意,我想从查询中获取新对象,而不是 Entity Framework 生成的对象。

以下让我接近,但抛出异常:“LINQ to Entities 无法识别该方法...”

var orders = 
(from o in Context.orders
join so in Context.suborders on o.id equals so.order_id into gj
select new Order
{
id = o.id,
name = o.name,
suborders = (from so in gj select new Suborder
{
so.id,
so.name
}).ToList()
}).ToList();

最佳答案

解决方案最终非常简单。关键是使用组连接让 SQL 对子订单执行左连接,并添加第二个 ToList() 调用以强制运行查询,这样您就不会尝试在 SQL 服务器上创建对象。

orders = Context.orders
.GroupJoin(
Context.suborders,
o => o.id,
so => so.order_id,
(o, so) => new { order = o, suborders = so })
.ToList()
.Select(r => new Order
{
id = r.order.id,
name = r.order.name,
suborders = r.suborders.Select(so => new Suborder
{
id = so.id,
name = so.name
}.ToList()
}).ToList();

此代码仅对所有对象及其子对象进行一次 SQL 查询。它还允许您将 EF 对象转换为您需要的任何对象。

关于c# - 使用 LINQ 查询和创建具有一对多关系的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20669802/

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