【发布时间】:2016-07-02 10:37:32
【问题描述】:
举个例子,我有一个Customer > Orders 和Order > Orderlines 的简单域模型。
我想获取所有客户的列表,每个客户都有最近的 10 个订单,包括他们的订单行。
以下 LINQ 不起作用(这并不完全令人惊讶),但如果可能的话,正确的语法应该是什么?
var customers = _context.Customers
.Include(c => c.Orders)
.OrderByDescending(c => c.CreatedDateTime)
.Take(10)
.ThenInclude(c => c.OrderLines);
生成的 SQL 获取客户的 TOP(10)(而不是订单的 TOP(10))。然后从最终结果中得到 ORDERBY DESC。因此 OrderByDescending 和 Take(10) 应用于客户而不是订单。
更新
以下代码(没有 ThenInclude)
var customers = _context.Customers
.Include(c => c.Orders)
.OrderByDescending(c => c.Created)
.Take(10)
生成以下 SQL..
SELECT [a].[Id], [a].[CreatedDateTime], [a].[CustomerID]
FROM [Order] AS [a]
INNER JOIN (
SELECT DISTINCT TOP(10) [c].[CreatedDateTime], [c].[Id]
FROM [Customer] AS [c]
) AS [c] ON [a].[CustomerID] = [c].[Id] ORDER BY [c].[CreatedDateTime] DESC, [c].[Id]
这显然不是我想要的。
【问题讨论】:
-
定义“不起作用”。它做什么?
-
我应该已经发布了生成的 SQL。我会回到它,看看我是否可以添加到问题中。我添加了行为摘要。
标签: c# sql entity-framework linq entity-framework-core