Distinct去除重复项

时间:2022-09-02 12:01:30

之前在做权限模块时,因不同角色可能拥有相同的菜单,导致呈现在浏览器上时出现重复菜单项,所以需要在获取用户拥有菜单项时需要过滤重复项,

用到了Distinct,两个重载

 public static IQueryable<TSource> Distinct<TSource>(this IQueryable<TSource> source);//默认相等比较器去重

public static IQueryable<TSource> Distinct<TSource>(this IQueryable<TSource> source, IEqualityComparer<TSource> comparer);//自定义比较器去重

 

每个菜单项都是一个对象,原来是打算借助下面在网上翻到的自定义比较器来去重

 1    public static class DistinctExt
 2     {
 3         public static IQueryable<T> Distinct<T,V>(this IQueryable<T> source, Func<T, V> keySelector)
 4         {
 5             return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
 6         }
 7     }
 8     public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
 9     {
10         private Func<T, V> keySelector;
11 
12         public CommonEqualityComparer(Func<T, V> keySelector)
13         {
14             this.keySelector = keySelector;
15         }
16 
17         public bool Equals(T x, T y)
18         {
19             return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
20         }
21 
22         public int GetHashCode(T obj)
23         {
24             return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
25         }
26     }

后来发现只用默认比较器去重就能达到目的,

why?难道返回的的不同角色下的菜单项引用同一实例,被自动去重掉了?后来想想咱是借助EF去操作数据库的,IQueryable<T>还并未执行,说明去重是在数据库端发生,

返回的数据已经是去重过后的了,