如何使用Linq和Entity Framework获取不同的,不区分大小写的列表

时间:2014-09-26 16:06:57

标签: 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 { e.Code, e.Description }, StringComparer.InvariantCultureIgnoreCase)
            .Select(e => e.First())
            .ToList();

但这似乎不想使用匿名对象。

添加.ToLower.ToLowerInvariant似乎也不起作用。也不使用Distinct(StringComparer.InvariantCultureIgnoreCase)代替GroupBy

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

3 个答案:

答案 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();
    }
}

随意调整您的需求。

Fiddle

答案 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)扩展方法(适用于大正义)