Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq和实体框架获得不同的、不区分大小写的列表_C#_Linq_Entity Framework - Fatal编程技术网

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
。这对我很有效,谢谢!我希望有更精简的内容,但这似乎不太可能。