日期:2014-05-20  浏览次数:21094 次

讨论,LINQ去除重复的数据(某个字段有重复的数据)的Distinct方法
我写了下面一个类,然后在LINQ的查询语句后追加.Distinct(new MyComparer());
想实现查询的结果里,不存在姓名相同的行。
编译通过了,但使用它就报错说“不支持用于查询运算符“Distinct”的重载。”。

    class MyComparer : IEqualityComparer<User>
    {
        public bool Equals(User x, User y)
        {
            if (x == null && y == null)
            {
                return false;
            }
            else
            {
                return x.username == y.username;
            }
        }

        public int GetHashCode(User obj)
        {
            return obj.username.GetHashCode();
        }
    }


User是Model中的类,查询语句返回的是IQueryable<User>型的数据。
------最佳解决方案--------------------
如果不介意性能(或者说重复的数据非常少)可以直接执行查询后再Distinct。

q.AsEnumerbale().Distinct( ... );
------其他解决方案--------------------
加油。。应当快实现了吧。
------其他解决方案--------------------
值得注意的是如果你查询的是一个片段(譬如分页结果)而希望对整体Distinct的话,这是不成立的。
------其他解决方案--------------------
我是查询之后Distinct( ... )的……
------其他解决方案--------------------
引用:
值得注意的是如果你查询的是一个片段(譬如分页结果)而希望对整体Distinct的话,这是不成立的。

确实有用到分页。
------其他解决方案--------------------
你有看到AsEnumerble没?
------其他解决方案--------------------
AsEnumerable

网吧的键盘真糟糕。。。。
------其他解决方案--------------------
引用:
你有看到AsEnumerble没?



这样没报错,但查出的结果是空的。
------其他解决方案--------------------
我不知道你是怎么看结果的,不过稳妥的办法也可以用ToList或ToArray来强制查询,再Distinct。
------其他解决方案--------------------
我还在看结果,实际AsEnumerble之后有数据 ,不过as IQueryable<User>之后就为null了。
现在我在仔细看是否去除了重复的数据。
------其他解决方案--------------------
显然不能再as回去,AsEnumerable已经令其执行查询了
------其他解决方案--------------------
把结果 as IQueryable <User>  数据就全部丢失了。
但我页面里需要的是IQueryable <User>型的结果集……
------其他解决方案--------------------
那是不可能的了,你页面怎么写的为何如此紧耦?为什么不请求IEnumerable<User>的?
------其他解决方案--------------------