我有以下代码:
var orders = context.Orders
.Include("Clients")
.GroupBy(i => i.Clients.ClientName)
.Select(i => i.OrderByDescending(it => it.OrderDate).FirstOrDefault());
我只想获取每个客户的最后订单。我从这里获得的代码的基础 Remove duplicates in the list using linq ,来自 Freddy 的回答。 (我包括“客户”,因为订单有 ClientId 但没有客户名称,结果将显示在网格中,包括我从客户那里获得的客户名称)。 这工作正常。
我的问题:
是否可以使用 asp.net 实体数据源控件来执行此操作?
是否可以在 asp.net 实体数据源控件中以某种方式使用 FirstOrDefault?
最佳答案
如果将 Include
移动到查询的末尾...
var orders = context.Orders
.GroupBy(i => i.Clients.ClientName)
.Select(i => i.OrderByDescending(it => it.OrderDate).FirstOrDefault())
.Include("Clients");
...您将获得包括他们的客户在内的订单
。
对于原始的 Include
,在应用 Include
后查询形状会发生变化。 This always makes Include
ineffective .您可以将其移动到查询的末尾,因为即使在分组之后,查询仍然返回 Order
,因此 Include
是适用的。
但是请注意,这是一个巨大的矫枉过正。从数据库中查询整个 Client
记录,具体化整个 Client
对象,最后您只显示它们的名称。将所需的数据投影到恰好包含您要显示的数据的 DTO 会好得多。例如:
var orders = context.Orders
.GroupBy(i => i.Clients.ClientName)
.Select(i => i.OrderByDescending(it => it.OrderDate).FirstOrDefault())
.Select(o => new OrderDto
{
o.OrderNumber,
o. ... // More Order properties
Client = o.Clients.Name
});
DTO 应该是一个包含这些属性的类。
我不知道实体数据源控件。从我在 MSDN 文档中看到的内容来看,它似乎过于局限,甚至无法充分调整查询以获取每个客户的最后订单。它需要一个实体集,没有 DTO。
关于c# - 如何使用 First Method 查询实体数据源的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37385603/