EF Distinct (IEqualityComparer) Fehler

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

Frage

Guten Morgen!

Gegeben:

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

Dies wird kompiliert, aber zur Laufzeit bekomme ich eine Linq to Entity could not translate Comparer -Exception Linq to Entity could not translate Comparer konnte.
Irgendwelche Vorschläge?

Akzeptierte Antwort

Wenn Sie eigene Vergleiche bereitstellen, müssen Sie den Distinct Aufruf in .NET-Code ausführen. Um sicherzustellen, dass dies geschieht, verwenden Sie AsEnumerable , um aus IQueryable<T> IEnumerable<T> :

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

Natürlich ziehen Sie an dieser Stelle mehr Daten aus der Datenbank. Eine Alternative besteht darin, die Daten stattdessen zu gruppieren:

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

Damit erhalten Sie die erste Entität, die mit jeder ID gefunden wurde (vorausgesetzt, mein Abfrage-Fu schlägt nicht fehl). Das ist im Grunde das, was Distinct sowieso macht, aber es ist alles in der Datenbank.

(Hinweis für zukünftige Leser: Das Aufrufen von First() ist sinnvoller als FirstOrDefault() , aber das funktioniert anscheinend nicht.)



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum