如何使用Linq和实体框架获得一个不同的、不区分大小写的列表
本文关键字:一个 不区 列表 大小写 实体 Linq 何使用 框架 | 更新日期: 2023-09-27 18:24:44
我需要从实体框架查询的结果中获得一个不区分大小写的列表。我有以下内容:
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
也不行。
似乎应该有一个简单的方法来做到这一点,但我没有找到。
我尝试了你说的各种方法,但都失败了。然而,我做到了:
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();
}
}
随时根据您的需要进行调整。
Fiddle
此查询可能需要两次通过。
第一个查询用于转换为小写,第二个查询用于分组。
唯一的转义符是您可以立即从实体框架中提取大写字母。
或者使用仍在开发中的其他EF/LINQ功能:(
混乱,但它有效:
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)
扩展方法(用于大法官)