Linq:Group By没有通过Sql生成Group

时间:2017-01-24 10:56:32

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

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

的LINQ:

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

没有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}的所有唯一值。为此,使用Enumerable.Distinct比使用GroupBy更快。

答案 2 :(得分:0)

我想你想从你的小组中带来最多的金额。 请试试这个;

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