如何使用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也不行。

似乎应该有一个简单的方法来做到这一点,但我没有找到。

如何使用Linq和实体框架获得一个不同的、不区分大小写的列表

我尝试了你说的各种方法,但都失败了。然而,我做到了:

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)扩展方法(用于大法官)