EF Distinct (IEqualityComparer) Errore

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

Domanda

Buongiorno!

Dato:

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

Questo verrà compilato, ma in runtime otterrò un Linq to Entity could not translate Comparer -Exception.
Eventuali suggerimenti?

Risposta accettata

Se stai fornendo i tuoi confronti, dovrai eseguire la chiamata Distinct nel codice .NET. Per assicurarti che ciò accada, utilizza AsEnumerable per trasformare IQueryable<T> in IEnumerable<T> :

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

Ovviamente a quel punto tirerai più dati dal database. Un'alternativa è invece raggruppare i dati:

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

Ciò ti porterà alla prima entità incontrata con ciascun ID (supponendo che la mia query-fu non mi stia fallendo). Questo è fondamentalmente ciò che Distinct fa comunque, ma è tutto nel database.

(Nota per i futuri lettori: chiamare First() ha più senso di FirstOrDefault() , ma a quanto pare non funziona.)



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché