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

标签 c# asp.net entity-framework

我有以下代码:

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/

相关文章:

c# - 从项目中删除引用 .dll 后如何找到它

c# - .NET和sql server数据库链接

c# - 如何向控件添加工具提示?

c# - 发布时将连接字符串从开发更改为生产

c# - 将 String、Float 和 DateTime 值插入 sql 表

c# - 如何使用 Entity Framework 从模型加载/保存/更新子集合?

c# - 使用哪个集合类 : Hashtable or Dictionary?

c# - 我怎样才能在开关盒中只走一次?

jquery - Recaptcha v2 并非每次都会加载

sql - 带有 Sql View 的 Entity Framework 在生成 .sql 文件中显示为表