3 Stimmen

Linq funktioniert in einer Anweisung, aber nicht mit Auswahl in Eigenschaft

Tengo un D Objekt, das aus der automatischen Zuordnung der D Tisch. Ich habe ihr in einer partiellen Klasse die folgende Eigenschaft hinzugefügt.

public Address PhysicalAddress
{
   get { return this.Addresses.FirstOrDefault(a => a.AddrType == "PHY"); }
}

Das funktioniert auch allein.

Ich möchte die folgende Linq-Abfrage darauf schreiben:

var result = from d in _db.D
    where d.PhysicalAddress.State == addr.State
    select d;

Das funktioniert nicht. Es wirft eine NotSupportedException wenn ich versuche, eine Iteration über result .

Die folgende Methode funktioniert jedoch:

var result = from d in _db.D
    where d.Addresses.Single(dAddr => dAddr.AddrType == "PHY").State == addr.State
    select d;

Warum funktioniert Linq to Sql auf diese Weise? Gibt es eine Möglichkeit, meine Eigenschaft so umzuschreiben, dass sie funktioniert?

3voto

Fadrian Sudaman Punkte 6353

Die LinQ-Anweisung gegen den Datenkontext versucht, eine SQL-Anweisung zu generieren, die sie dann gegen die Datenbank ausführt. Da PhysicalAddress ist eine logische Eigenschaft, die Sie durch partielle Klasse definieren, obwohl der Typ weiß über sie daher kompilieren, Linq kann nicht zugeordnet, dass eine DB-Spalte, um dynamisch die Abfrage durch die Felder zu konstruieren. Bei der Verwendung von Linq zu Sql, Stick streng mit allen zugeordneten Spalte generiert.

Der Code in der Eigenschaft funktioniert, weil, wenn Sie für die Adressen, die intern auf eine gültige Spalte oder EntityRef zugeordnet generiert fragen.

2voto

AxelEckenberger Punkte 16238

Sie können Ihre Tabelle auch explizit aufzählen, bevor Sie die Where-Klausel auf sie anwenden, und so verhindern, dass ein SQL erzeugt wird, das nicht abgebildet werden kann.

Achten Sie aber auf den Leistungsabfall! Sie ziehen alles, was Sie nicht herausgefiltert haben, bevor Sie die .ToList() ausführen! Wenn Sie dies bei einer großen Tabelle tun, kann es sein Desaströs für Ihre Abfrageleistung.

var result = _db.D.ToList().Where(d => d.PhysicalAddress.State == addr.State); 

oder mit der Abfragesyntax

var result = from d in _db.D.ToList()
    where d.PhysicalAddress.State == addr.State
    select d;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X