C# 如何使用Linq和实体框架获得不同的、不区分大小写的列表
我需要从实体框架查询的结果中获得一个不区分大小写的列表。我有以下资料:C# 如何使用Linq和实体框架获得不同的、不区分大小写的列表,c#,linq,entity-framework,C#,Linq,Entity Framework,我需要从实体框架查询的结果中获得一个不区分大小写的列表。我有以下资料: var myList = myEF.GroupBy(e => new { e.Code, e.Description }) .Select(e => e.First()) .ToList(); 这给了我一个清晰的列表,但它是区分大小写的。我需要区分大小写 我想我应该可以做这样的事情: var myList = myEF.GroupBy(e => new {
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
似乎应该有一个简单的方法来实现这一点,但我没有找到它。您可能需要通过两次才能完成此查询 第一个查询用于转换为小写,第二个查询用于分组 唯一的转义是您可以立即从实体框架中提取大写字母 或者使用仍在开发中的其他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)
}
}
私有类StructureTupleComparer:IEqualityComparer{
私人IEqualityComparer\u cmp;
公共结构比较程序(IEqualityComparer cmp){
这个.\u cmp=cmp
}
公共布尔等于(元组t1,元组t2)
{
返回cmp(t1.Item1,t2.Item1)和cmp(t1.Item2,t2.Item2);
}
公共整数GetHashCode(元组t)
{
返回_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();
var myList=myEF.GroupBy(e=>newtuple(e.code,e.Description),
新的StructureTupleComparer(StringComparer.InvariantCultureInogoreCase))
.Select(e=>e.First())
.ToList();
希望在美好的未来的某个时候,会有一个
静态I分组GroupBy(这个IEnumerable src,Func groupingprojection,Func equalitytester)
扩展方法(为了更大的正义)我尝试了你说的各种方法,但都失败了。然而,我成功了:
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();
}
}
var distinct=list.distinct(新的CaseInsensitiveComparer());
公共类CaseInsensitiveComparer:IEqualityComparer如果您不区分大小写,如何确保区分?您可以尝试myEF.GroupBy(e=>new{e.code.ToLower(),e.Description.ToLower()})
同意@Mrchief,它应该按照我最初的帖子“ToLower”或“ToLowerInvariant”工作行得通。您的字符串区域性是否特定?如果是,请尝试OrdinalingOrecase
而不是InvariantCultureInogoreCase
。这对我很有效,谢谢!我希望有更精简的内容,但这似乎不太可能。