我试图在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发布于 2017-01-24 11:05:38
它没有创建GROUP BY,因为它是不必要的。您使用的是group into,不是迭代组,也不是聚合任何值。如果Id是唯一的标识列,则甚至不会创建组,因为每个组只有一个项。这与简单的选择基本上是一样的。
您必须接受EF将根据自己对LINQ查询的计算结果创建SQL查询。这些查询可能不同。你唯一的保证就是他们产生同样的结果。
发布于 2017-01-24 11:31:16
没有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更快。
发布于 2017-01-24 11:37:55
我想你想从你的团队中拿出数量最多的产品。请试试这个;
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)
});https://stackoverflow.com/questions/41826375
复制相似问题