EF Distinct(IEqualityComparer)错误

And*_*air 14 .net c# linq-to-entities entity-framework c#-3.0

早上好!

鉴于:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 32

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

var result = myEntity.MyDomainEntity
        .Where(myDomainEntity => myDomainEntity.MySpecialID > default(int))
        .AsEnumerable()
        .Distinct(new FooComparer());
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • System.NotSupportedException:方法"First"只能用作最终查询操作.请考虑在此实例中使用方法"FirstOrDefault". (2认同)