首页
学习
活动
专区
圈层
工具
发布

Linq:
EN

Stack Overflow用户
提问于 2017-01-24 10:56:32
回答 3查看 924关注 0票数 2

我试图在linq中对c#中的实体执行一个组,但是生成的查询中没有包含一个组,其中只包含生成的选择

林克:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-24 11:05:38

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

您必须接受EF将根据自己对LINQ查询的计算结果创建SQL查询。这些查询可能不同。你唯一的保证就是他们产生同样的结果。

票数 6
EN

Stack Overflow用户

发布于 2017-01-24 11:31:16

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

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

代码语言:javascript
复制
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更快。

票数 0
EN

Stack Overflow用户

发布于 2017-01-24 11:37:55

我想你想从你的团队中拿出数量最多的产品。请试试这个;

代码语言:javascript
复制
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)
                   });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41826375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档