讨论,LINQ去除重复的数据(某个字段有重复的数据)的Distinct方法我写了下面一个类,然后在LINQ的查询语句后
讨论,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( ... )的……
[其他解释]确实有用到分页。
[其他解释]你有看到AsEnumerble没?
[其他解释]AsEnumerable
网吧的键盘真糟糕。。。。
[其他解释]这样没报错,但查出的结果是空的。
[其他解释]我不知道你是怎么看结果的,不过稳妥的办法也可以用ToList或ToArray来强制查询,再Distinct。
[其他解释]我还在看结果,实际AsEnumerble之后有数据 ,不过as IQueryable<User>之后就为null了。
现在我在仔细看是否去除了重复的数据。
[其他解释]显然不能再as回去,AsEnumerable已经令其执行查询了
[其他解释]把结果 as IQueryable <User> 数据就全部丢失了。
但我页面里需要的是IQueryable <User>型的结果集……
[其他解释]那是不可能的了,你页面怎么写的为何如此紧耦?为什么不请求IEnumerable<User>的?
------其他解决方案--------------------
因为要用到Linq的分页。
[其他解释]转换成IQueryable <User>,用.AsQueryable<User>()才是正确的。
问题已经解决。
总结:使用这种去除重复数据的方法(自定义的比较):
.Distinct(new MyComparer());
必须先.AsEnumerable()一下。
结果需要转换成IQueryable型的,最佳方法是用.AsQueryable()。
[其他解释]我只能说,分页必须在Distinct后,否则会有问题的,不必AsQueryable回去,你应该把页面改成接收IEnumerable,因为IQueryable就是IEnumerable。一旦转换成IEnumerable,编译成SQL执行的特性已经失去,再转换成IQueryable也是徒劳。
[其他解释]我说说我这边的情况,之前接受结果的对象是个IQueryable<User>型的数据。
所以需要AsQueryable<User>()一下,而且用AsQueryable<User>()后得到的结果集加.Where还可以查询,没出现你说的:
“一旦转换成IEnumerable,编译成SQL执行的特性已经失去,再转换成IQueryable也是徒劳。”的情况。不知是不是我理解错了你这句话。
现在我按你说的将接受结果的对象改成IEnumerable<User>型的了,也可以运行。
但因为在Distinct之后需要.OrderByDescending()一下(必须的),最后又得AsEnumerable<User>()一下,以便供下次查询,这样好么?
相比之前的Distinct(new..)后AsQueryable<User>()一下再供查询或者返回给IQueryable<User>对象,性能是否有所提升呢?
[其他解释]嗯,明白了。
[其他解释]我也不会!!!!!!!!!
[其他解释]补充: 修改后没再做转换成IQueryable<User>的操作了。但排序后不是IEnumerable<User>型的了,所以又得转换成IEnumerable<User>型的以便直接返回个接受的对象,或者在这个的结果集范围(消除了重复数据)里查询。
[其他解释]GroupBy Select First
[其他解释]嗯,明白了。