i.Clients.ClientName) -6ren">
gpt4 book ai didi

c# - 如何使用 First Method 查询实体数据源的数据?

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:47 25 4
gpt4 key购买 nike

我有以下代码:

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/

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