C# Linq:Group By没有生成Group By Sql

C# Linq:Group By没有生成Group By Sql,c#,sql,sql-server,entity-framework,linq,C#,Sql,Sql Server,Entity Framework,Linq,我试图在linq中对c中的实体执行group by,但生成的查询中没有包含group by,而是生成了selects 林克: 它没有创建分组依据,因为它不是必需的。您正在使用group into,您没有迭代组,也没有聚合任何值。如果Id是唯一的identity列,则您甚至不会创建组,因为每个组只有一个项。这与简单的选择基本相同 您必须接受EF将根据自己对LINQ查询的评估创建SQL查询。这些查询可能有所不同。您唯一能保证的是它们产生相同的结果。没有group by,因为您不会迭代每个组中的元素

我试图在linq中对c中的实体执行group by,但生成的查询中没有包含group by,而是生成了selects

林克:

它没有创建分组依据,因为它不是必需的。您正在使用group into,您没有迭代组,也没有聚合任何值。如果Id是唯一的identity列,则您甚至不会创建组,因为每个组只有一个项。这与简单的选择基本相同


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

没有group by,因为您不会迭代每个组中的元素

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}值。为此,它比GroupBy使用更快。

我认为您希望从您的团队中获得最多的额度。 请试试这个

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)
                   });

你能给我们看看你的模型吗?回答得很好,尤其是Id部分!EF确实足够聪明,可以基于元数据删除不必要的运算符。是的,是关于聚合函数的,我忘了添加计数感谢您的帮助在SQL GROUP BY中没有必要比DISTINCT慢。将其中一个替换为另一个,在索引视图中会得到相同的执行计划,甚至需要使用GROUP by,因为DISTINCT是被禁止的。在LINQ查询中,这并不重要,因为它从未执行过。
var myItems = items.Select(item => new
{
    X = item.A,
    Y = item.B,
    Z = item.C,
})
.Select(item => new
{
    X = item.A,
    Z = item.C,
});
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)
                   });