繁体   English   中英

C# Linq 分组 Object

[英]C# Linq Group by Object

我有一个在 LINQ 到 SQL 语句中使用 group by 的问题。

我的鳕鱼是

var combinedItems = (from article in articles
                     join author in authors
                     on article.AuthorId equals author.Id into tempAuthors
                     from tempAuthor in tempAuthors.DefaultIfEmpty()
                     select new { article , author = tempAuthor});

var groups1 = (from combinedItem in combinedItems
               group combinedItem by combinedItem.article into g
               select g.Key).ToList();

var groups2 = (from combinedItem in combinedItems
               group combinedItem by combinedItem.article.Id into g
               select g.Key).ToList();

我尝试以两种不同的方式进行分组。 第一种方式,我按 object 分组,第二种方式我只是按其中一个对象中的字段分组。

当我运行groups1时,我收到一条错误消息,说需要在客户端进行评估,而当我使用groups2时,一切正常。 我能问一下有什么问题吗? 如果我想按 object 分组,有什么办法吗?

如果您想按 object 进行分组,因为您没有在Article class 中覆盖EqualsGetHashCode()或实施IEqualityComparer<Article> ,您只是得到默认比较,它检查引用是否相等。 所以你需要的是这样的:

class GroupItemComparer : IEqualityComparer<Article>
{

    public bool Equals(Article x, Article y)
    {
        return x.Id == y.Id &&
            x.Name == y.Name;
    }

    public int GetHashCode(Article obj)
    {
        return obj.Id.GetHashCode() ^
            obj.Name.GetHashCode();
    }
}

然后您需要将查询更改为 lambda 表达式:

var groups1 = combinedItems.GroupBy(c => c.article , new GroupItemComparer())
                           .Select(c => c.Key).ToList();

In case you got any exception regarding translation your method to SQL, you can use AsEnumerable or ToList methods before your GroupBy method, with this methods after data is loaded, any further operation is performed using Linq to Objects, on the data already in memory.

正如其他人所指出的, GroupBy默认使用引用相等,您可以通过指定一个或多个要分组的属性来绕过它。 为什么这是一个错误

查询的重点是将您的 Linq 查询转换为 SQL。 由于客户端上的 object 引用相等不能轻易转换为 SQL,因此翻译器不支持它并给您一个错误。

当您提供一个或多个属性进行分组时,提供者可以将其转换为 SQL(例如GROUP BY article.Id ),因此第二种方法可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM