我正在尝试通过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
答案 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)
});