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()更有意義,但顯然這不起作用。)



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因