如何实现的IEqualityComparer返回不同的值? [英] How to implement IEqualityComparer to return distinct values?

查看:228
本文介绍了如何实现的IEqualityComparer返回不同的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个L2E查询,返回包含重复对象的一些数据。我需要删除这些重复的对象。基本上,我应该假设如果他们的ID都相同则对象是重复的。我试过 q.Distinct(),但仍返回重复的对象。然后我试着实现我自己的IEqualityComparer,并把它传递给鲜明的()方法。该方法失败,下面的文字:

I have a L2E query that returns some data that contains duplicate objects. I need to remove those duplicate objects. Basically I should assume that if their IDs are the same then the objects are duplicate. I've tried q.Distinct(), but that still returned duplicate objects. Then I've tried implementing my own IEqualityComparer and passing it to the Distinct() method. The method failed with following text:

LINQ实体无法识别方法
  System.Linq.IQueryable 1 [DAL.MyDOClass]
  不同的[MyDOClass](System.Linq.IQueryable
1 [DAL.MyDOClass]
  System.Collections.Generic.IEqualityComparer`1 [DAL.MyDOClass])'
  法,这种方法不能被翻译成店前pression。

LINQ to Entities does not recognize the method 'System.Linq.IQueryable1[DAL.MyDOClass] Distinct[MyDOClass](System.Linq.IQueryable1[DAL.MyDOClass], System.Collections.Generic.IEqualityComparer`1[DAL.MyDOClass])' method, and this method cannot be translated into a store expression.

这是EqualityComparer执行:

And here is the implementation of EqualityComparer:

  internal class MyDOClassComparer: EqualityComparer<MyDOClass>
    {
        public override bool Equals(MyDOClass x, MyDOClass y)
        {
            return x.Id == y.Id;
        }

        public override int GetHashCode(MyDOClass obj)
        {
            return obj == null ? 0 : obj.Id;
        }
    }

所以,我怎么写我自己的的IEqualityComparer 是否正确?

推荐答案

这是 EqualityComparer 不是要走的路 - 它只能过滤你的结果在内存中如设置:

An EqualityComparer is not the way to go - it can only filter your result set in memory eg:

var objects = yourResults.ToEnumerable().Distinct(yourEqualityComparer);

您可以通过标识使用 GROUPBY 方法组和首先方法,让你的数据库只检索每个ID如独特的条目:

You can use the GroupBy method to group by IDs and the First method to let your database only retrieve a unique entry per ID eg:

var objects = yourResults.GroupBy(o => o.Id).Select(g => g.First());

这篇关于如何实现的IEqualityComparer返回不同的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆