Interner .NET Framework-Datenanbieterfehler 1025

.net c# entity-framework entity-framework-4 expression-trees

Frage

IQueryable<Organization> query = context.Organizations;

Func<Reservation, bool> predicate = r => !r.IsDeleted;

query.Select(o => new { 
    Reservations = o.Reservations.Where(predicate)
}).ToList();

Diese Abfrage löst die Ausnahme "Interner .NET Framework-Datenproviderfehler 1025" aus, die Abfrage jedoch nicht.

query.Select(o => new { 
    Reservations = o.Reservations.Where( r => !r.IsDeleted)
}).ToList();

Ich muss die erste verwenden, weil ich ein paar if-Anweisungen überprüfen muss, um das richtige Prädikat zu konstruieren. Ich weiß, dass ich nicht verwenden kann, wenn Aussagen in diesem Fall deshalb einen Delegierten als Parameter übergeben.

Wie kann ich die erste Anfrage bearbeiten?

Akzeptierte Antwort

Während die obigen Antworten wahr sind, beachten Sie, dass wenn Sie versuchen, es nach einer Select-Anweisung zu verwenden, AsQueryable() explizit AsQueryable() muss, andernfalls wird der Compiler annehmen, dass wir versuchen, IEnumerable-Methoden zu verwenden, die einen Func und nicht Expression<Func> .

Dies war wahrscheinlich das Problem des ursprünglichen Posters, da sonst der Compiler die meiste Zeit darüber klagen wird, dass er Expression<Func> und nicht Func .

Demo: Folgendes wird fehlschlagen:

MyContext.MySet.Where(m => 
      m.SubCollection.Select(s => s.SubItem).Any(expr))
         .Load()

Während das Folgende funktioniert:

MyContext.MySet.Where(m => 
      m.SubCollection.Select(s => s.SubItem).AsQueryable().Any(expr))
         .Load()

Beliebte Antwort

Nach dem Erstellen der Kopfgeld (Ratten!), Fand ich diese Antwort , die mein Problem gelöst hat. (Mein Problem beinhaltete einen .Any() Anruf, der etwas komplizierter ist als diese Frage ...)

Kurz gesagt, hier ist Ihre Antwort:

IQueryable<Organization> query = context.Organizations;

Expression<Func<Reservation, bool>> expr = r => !r.IsDeleted;

query.Select(o => new { Reservations = o.Reservations.Where(expr) })
  .ToList();

Lesen Sie die referenzierte Antwort, um zu erklären, warum Sie die lokale Variable expr , und Sie können nicht direkt auf eine andere Methode des Rückgabetyps Expression<Func<Reservation, bool>> .



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow