之前在做权限模块时,因不同角色可能拥有相同的菜单,导致呈现在浏览器上时出现重复菜单项,所以需要在获取用户拥有菜单项时需要过滤重复项,
用到了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>还并未执行,说明去重是在数据库端发生,
返回的数据已经是去重过后的了,