Erreur EF Distinct (IEqualityComparer)

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

Question

Bonjour!

Donné:

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

Cela compilera, mais au moment de l'exécution, j'aurai un Linq to Entity could not translate Comparer -Exception
Aucune suggestion?

Réponse acceptée

Si vous fournissez vos propres comparaisons, vous devez exécuter l'appel Distinct en code .NET. Pour vous assurer que cela se produit, utilisez AsEnumerable pour transformer IQueryable<T> en IEnumerable<T> :

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

Bien sûr, à ce stade, vous allez extraire davantage de données de la base de données. Une alternative consiste à grouper les données à la place:

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

Cela vous donnera la première entité rencontrée avec chaque ID (en supposant que mon query-fu ne me manque pas). C'est essentiellement ce que Distinct fait de toute façon, mais tout est dans la base de données.

(Remarque pour les futurs lecteurs: appeler First() est plus logique que FirstOrDefault() , mais apparemment cela ne fonctionne pas.)



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow