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を取得してComparer -ExceptionをLinq to Entity could not translate Comparer
助言がありますか?

受け入れられた回答

独自の比較を提供している場合は、.NETコードでDistinct呼び出しを実行する必要があります。これを確実にするには、 AsEnumerableを使用してIQueryable<T>IEnumerable<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で最初に検出されたエンティティが取得されます(私のquery-fuが失敗していないと仮定して)。それがDistinctの基本的な動作ですが、すべてデータベースにあります。

(将来の読者へのメモ: First()を呼び出すことはFirstOrDefault()より理にかなっていますが、どうやらうまくいきません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ