我需要从实体框架查询的结果中获取不区分大小写的列表。我有以下内容:
var myList = myEF.GroupBy(e => new { e.Code, e.Description })
.Select(e => e.First())
.ToList();
这给了我一个独特的列表,但它区分大小写。我需要不区分大小写。
我认为我应该可以做这样的事情:
var myList = myEF.GroupBy(e => new { e.Code, e.Description }, StringComparer.InvariantCultureIgnoreCase)
.Select(e => e.First())
.ToList();
但这似乎不想使用匿名对象。
添加.ToLower
或.ToLowerInvariant
似乎也不起作用。也不使用Distinct(StringComparer.InvariantCultureIgnoreCase)
代替GroupBy
。
似乎应该有一种简单的方法来做到这一点,但我找不到它。
答案 0 :(得分:3)
我尝试过你说的各种方法,但都失败了。然而,我得到了这个工作:
var distinct = list.Distinct(new CaseInsensitiveComparer());
public class CaseInsensitiveComparer : IEqualityComparer<A>
{
public bool Equals(A x, A y)
{
return x.Code.Equals(y.Code, StringComparison.OrdinalIgnoreCase) &&
x.Description.Equals(y.Description, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(A obj)
{
return obj.Code.ToLowerInvariant().GetHashCode();
}
}
随意调整您的需求。
答案 1 :(得分:0)
此查询可能需要2次传递。
首次查询转换为小写,第二次查询分组。
只有转义才能立即从Entity Framework中以大写字母提取。
或者还有其他仍处于开发阶段的EF / LINQ功能:(
答案 2 :(得分:0)
凌乱,但它有效:
private class StructuralTupleComparer<T>: IEqualityComparer<Tuple<T, T>>{
private IEqualityComparer<T> _cmp;
public StructuralTupleComparer(IEqualityComparer<T> cmp){
this._cmp = cmp
}
public bool Equals(Tuple<T, T> t1, Tuple<T, T> t2)
{
return _cmp(t1.Item1, t2.Item1) && _cmp(t1.Item2, t2.Item2);
}
public int GetHashCode(Tuple<T, T> t)
{
return _cmp.GetHashCode(t.Item1) ^ _cmp.GetHashCode(t.Item2)
}
}
然后
var myList = myEF.GroupBy(e => new Tuple<String, String>(e.Code, e.Description),
new StructuralTupleComparer(StringComparer.InvariantCultureIgnoreCase))
.Select(e => e.First())
.ToList();
并希望在辉煌的未来某个时刻会有一个static IGrouping GroupBy<T, U>(this IEnumerable<T> src, Func<T, U> groupingprojection, Func<U, bool> equalitytester)
扩展方法(适用于大正义)