【问题标题】:Linq: Group By didn't generate Group by SqlLinq:Group By 未生成 Group by Sql
【发布时间】:2017-01-24 10:56:32
【问题描述】:

我正在尝试在 linq 中对 c# 中的实体进行分组,但生成的查询中没有包含分组,它只生成了选择

林克:

IQueryable<EntityDataView> data = (from a in ctx.EntityDataViews
                                                        select a);

IQueryable<viewClass> groupedData = (from x in data
                                                       group x by new
                                                       {
                                                           x.Id,
                                                           x.Code,
                                                           x.Name,
                                                           x.Amuont,

                                                       } into g
                                                       orderby g.Key.Amuont descending
                                                       select new viewClass()
                                                       {
                                                           Id = g.Key.Id,
                                                           Code = g.Key.Code,
                                                           Name = g.Key.Name,
                                                           Amuont = g.Key.Amuont,
                                                       });

SQL:

SELECT 
[Project1].[Code] AS [Code], 
[Project1].[Name] AS [Name], 
[Project1].[Id] AS [Id], 
[Project1].[Amuont] AS [Amuont]
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Code] AS [Code], 
    [Extent1].[Amuont] AS [Amuont], 
    [Extent1].[Name] AS [Name], 
    FROM [dbo].[EntityDataView] AS [Extent1]
)  AS [Project1]
ORDER BY [Project1].[Amuont] DESC

【问题讨论】:

  • 你能给我们看看你的模型吗?

标签: c# sql sql-server entity-framework linq


【解决方案1】:

它没有创建GROUP BY,因为它没有必要。您正在使用group into,您没有迭代组,也没有聚合任何值。如果Id 是您的唯一身份列,您甚至没有创建组,因为每个组只有一个项目。这与简单的选择基本相同。

您必须接受 EF 将根据自己对 LINQ 查询的评估来创建 SQL 查询。这些查询可能不同。您拥有的唯一保证是它们会产生相同的结果。

【讨论】:

  • 不错的答案(尤其是Id 部分!EF 确实足够聪明,可以根据元数据删除不必要的运算符。
  • 是的,它是关于聚合函数的,我忘了添加 Count()
  • 感谢您的帮助
【解决方案2】:

没有分组依据,因为您不会遍历每个组中的元素。

IQueryable 的优点在于它在优化查询方面非常聪明。如果您先在查询中添加一个元素,然后再删除它,您将不会在 SQL 中看到它:

var myItems = items.Select(item => new
{
    X = item.A,
    Y = item.B,
    Z = item.C,
})
.Select(item => new
{
    X = item.A,
    Z = item.C,
});

您不会在 SQL 查询中看到 B 的选择,IQueryable 足够聪明,可以看到您不想要它。

顺便说一句,您似乎想要 {Id, Code, Name, Amount} 的所有唯一值。为此,使用 Enumerable.Distinct 比使用 GroupBy 更快。

【讨论】:

  • 在 SQL 中 GROUP BY 没有必要比 DISTINCT 慢。一个一个替换,你得到相同的执行计划(在索引视图中你甚至需要使用GROUP BY,因为DISTINCT是被禁止的)。而在 LINQ 查询中则无关紧要,因为它永远不会被执行。
【解决方案3】:

我认为您希望从您的团队中带来最大数量的线路。 请试试这个;

IQueryable<viewClass> groupedData = (from x in data
                   group x by new
                   {
                       x.Code,
                       x.Name

                   } into g
                   select new viewClass()
                   {
                       Id = gp.OrderByDescending(x => x.Amuont).FirstOrDefault().Id,
                       Code = g.Key.Code,
                       Name = g.Key.Name,
                       Amuont = g.Max(_=>_.Amuont)
                   });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多