gpt4 book ai didi

ef-code-first - EF5 代码首先排序嵌套项

转载 作者:行者123 更新时间:2023-12-04 06:20:50 25 4
gpt4 key购买 nike

在使用 Entity Framework 5 Code First 检索一组数据时,我遇到了一个小问题。这是我的代码:

var data = context.Customers
.Include("Orders")
.Include("Orders.Items")
.Include("Orders.Items.Article").ToArray();
foreach (var customer in data)
{
customer.Orders = customer.Orders.OrderByDescending(o => o.OrderDate).ToArray();
}

这有效(哇!)。但是,我试图让 foreach 离开那里,我希望数据库引擎继续负责处理数据。我该怎么做呢?

我试过这种类型的连接:

var data = from customer
in context.Customers
select new {
customer.Id,
customer.Name,
// customer.Orders below doesn't have an Include() to include order items
Orders = customer.Orders.OrderByDescending(b => b.OrderDate)
};

// Translate anonymous object to actual models
var customers = new List<CustomerModel>();
foreach (var customer in data)
{
customers.Add(new CustomerModel()
{
Id = customer.Id,
Name = customer.Name,
Orders = customer.Orders.ToArray()
});
}

但是,正如评论所说,customer.Orders 没有 Include() 方法来包含项目和属于这些项目的文章。然后我尝试从 context 而不是 customer 对象进入:

Orders = context.Orders.Include("Items").Where(o => o.Id == customer.Id)

但这会导致运行时异常,即 Include() 不能以这种方式使用(在嵌套查询中?):

Method 'System.Data.Entity.Infrastructure.DbQuery`1[MyTests.Models.OrderModel] Include(System.String)' declared on type 'System.Data.Entity.Infrastructure.DbQuery`1[MyTests.Models.OrderModel]' cannot be called with instance of type 'System.Data.Objects.ObjectQuery`1[MyTests.Models.OrdersModel]'

这样的事情甚至可能吗?

如何让数据库处理数据而不是在我的第一个代码块中使用 foreach

提前致谢。

日本

最佳答案

你可以试试这个查询:

List<CustomerModel> customers =
(from customer
in context.Customers
select new {
customer.Id,
customer.Name,
Orders = customer.Orders
.OrderByDescending(o => o.OrderDate)
.Select(o => new {
Order = o,
Items = o.Items
.Select(i => new {
Item = i,
Article = i.Article
})
})
})
.AsEnumerable()
.Select(x => new CustomerModel
{
Id = x.Id,
Name = x.Name,
Orders = x.Orders.Select(o => o.Order).ToArray()
})
.ToList();

尽管内部匿名对象中的 ItemArticle 未被使用,但它们将被加载并且 Entity Framework 的 relationship fixup 应该设置正确的导航Order.ItemsItem.Article 的属性 - 只要关系不是多对多并且您不使用 AsNoTracking .

如果您想将此作为非跟踪查询来执行,您基本上必须自己设置导航属性。应该可以通过在 AsEnumerable()Select(...) 之间移动以下附加的 Select 来实现:

           // .AsEnumerable()
.Select(x => new {
Id = x.Id,
Name = x.Name,
Orders = x.Orders.Select(y => {
y.Order.Items = y.Items.Select(z => {
z.Item.Article = z.Article;
return z.Item;
}).ToArray();
return y;
})
})
// .Select(x => new CustomerModel ...

关于ef-code-first - EF5 代码首先排序嵌套项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998084/

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