EF Distinct(IEqualityComparer)错误

.net c# c#-3.0 entity-framework linq-to-entities

早上好!

鉴于:

public class FooClass
{
    public void FooMethod()
    {
        using (var myEntity = new MyEntity)
        {
            var result = myEntity.MyDomainEntity.Where(myDomainEntity => myDomainEntity.MySpecialID > default(int)).Distinct(new FooComparer);
        }
    }

}

public class FooComparer : IEqualityComparer<MyEntity.MyDomainEntity>
{
    public bool Equals(MyEntity.MyDomainEntity x, MyEntity.MyDomainEntity y)
    {
        return x.MySpecialID == y.MySpecialID;
    }

    public int GetHashCode(MyEntity.MyDomainEntity obj)
    {
        return obj.MySpecialID.GetHashCode();
    }
}

这将编译,但在运行时我将得到一个Linq to Entity could not translate Comparer -Exception。
有什么建议?

一般承认的答案

如果您提供自己的比较,则需要在.NET代码中执行Distinct调用。要确保发生这种情况,请使用AsEnumerableIQueryable<T>转换为IEnumerable<T>

var result = myEntity.MyDomainEntity
        .Where(myDomainEntity => myDomainEntity.MySpecialID > default(int))
        .AsEnumerable()
        .Distinct(new FooComparer());

当然,此时您将从数据库中提取更多数据。另一种方法是将数据分组:

var result = from entity in myEntity.MyDomainEntity
             where entity.MySpecialID > 0
             group entity by entity.MySpecialID into groups
             select groups.FirstOrDefault();

这将使你获得每个ID遇到的第一个实体(假设我的查询 - fu没有让我失望)。这基本上就是Distinct所做的,但它完全在数据库中。

(请注意未来的读者:调用First()FirstOrDefault()更有意义,但显然这不起作用。)



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因