Die Methode kann nicht in einen Geschäftsausdruck übersetzt werden


89

Ich habe gesehen, dass dieser Code mit LINQ to SQL funktioniert, aber wenn ich Entity Framework verwende, wird der folgende Fehler ausgegeben:

LINQ to Entities erkennt die Methode 'System.Linq.IQueryable'1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures ()' nicht und diese Methode kann nicht in einen Geschäftsausdruck übersetzt werden. '

Der Repository-Code lautet wie folgt:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates
           let AllCommFeat = GetCommunityFeatures()
           let AllHomeFeat = GetHomeFeatures()
           select new Models.Estate
                      {
                                EstateId = e.EstateId,
                                AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
                                AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
                      };
}

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
    return from f in entity.CommunityFeatures
           select new CommunityFeatures
                      {
                          Name = f.CommunityFeature1,
                          CommunityFeatureId = f.CommunityFeatureId
                      };
}

public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
    return from f in entity.HomeFeatures
           select new HomeFeatures()
           {
               Name = f.HomeFeature1,
               HomeFeatureId = f.HomeFeatureId
           };
}

LazyList ist eine Liste, die die Leistungsfähigkeit von IQueryable erweitert.

Könnte jemand erklären, warum dieser Fehler auftritt?

Antworten:


115

Grund: Mit dem Design, LINQ to Entities erfordert den gesamten LINQ - Abfrage - Ausdruck auf einen Server Abfrage übersetzt werden. Auf dem Client werden nur einige nicht korrelierte Unterausdrücke (Ausdrücke in der Abfrage, die nicht von den Ergebnissen des Servers abhängen) ausgewertet, bevor die Abfrage übersetzt wird. Beliebige Methodenaufrufe ohne bekannte Übersetzung, wie in diesem Fall GetHomeFeatures (), werden nicht unterstützt.
Genauer gesagt unterstützt LINQ to Entities nur parameterlose Konstruktoren und Initialisierer .

Lösung: Um diese Ausnahme zu überwinden, müssen Sie Ihre Unterabfrage mit der Hauptabfrage für GetCommunityFeatures () und GetHomeFeatures () zusammenführen.anstatt Methoden direkt aus der LINQ-Abfrage heraus aufzurufen. Außerdem gibt es ein Problem in den Zeilen, in denen Sie versucht haben, eine neue Instanz von LazyList mithilfe der parametrisierten Konstruktoren zu instanziieren , wie Sie es möglicherweise in LINQ to SQL getan haben . Zu diesem Zweck würde die Lösung darin bestehen, zur Client-Auswertung von LINQ-Abfragen (LINQ to Objects) zu wechseln. Dazu müssen Sie die AsEnumerable- Methode für Ihre LINQ to Entities-Abfragen aufrufen, bevor Sie den LazyList-Konstruktor aufrufen.

So etwas sollte funktionieren:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates.AsEnumerable()
       let AllCommFeat = from f in entity.CommunityFeatures
                         select new CommunityFeatures {
                             Name = f.CommunityFeature1,
                             CommunityFeatureId = f.CommunityFeatureId
                         },
       let AllHomeFeat = from f in entity.HomeFeatures
                         select new HomeFeatures() {
                             Name = f.HomeFeature1,
                             HomeFeatureId = f.HomeFeatureId
                         },
       select new Models.Estate {
            EstateId = e.EstateId,
            AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
            AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
       };
}


Weitere Informationen: Bitte werfen Sie einen Blick auf LINQ to Entities. Was wird nicht unterstützt? Für mehr Information. Schauen Sie sich auch LINQ to Entities, Workarounds an, was nicht unterstützt wird, um eine detaillierte Diskussion über die möglichen Lösungen zu erhalten. (Beide Links sind die zwischengespeicherten Versionen, da die ursprüngliche Website nicht verfügbar ist.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.