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

用到了Distinct,两个重载

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

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

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

    public static class DistinctExt
{
public static IQueryable<T> Distinct<T,V>(this IQueryable<T> source, Func<T, V> keySelector)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
}
}
public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
{
private Func<T, V> keySelector; public CommonEqualityComparer(Func<T, V> keySelector)
{
this.keySelector = keySelector;
} public bool Equals(T x, T y)
{
return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
} public int GetHashCode(T obj)
{
return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
}
}

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

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

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

04-16 15:36