Where-Klausel für die Sammlung
Ich bin mit dem BAGA-code von Julie Lerman DbContext-Buch. Ich will erstellen Sie die folgende SQL-Abfrage in LINQ und setzen die Ergebnisse in eine Liste von Sammlungen und habe Probleme.
http://learnentityframework.com/downloads/
SELECT * FROM baga.Locations d
LEFT JOIN Lodgings l ON d.LocationID = l.destination_id
WHERE d.Country = 'usa'
AND (l.MilesFromNearestAirport > 5 or l.MilesFromNearestAirport is null)
So, in Englisch, bekommen alle Standorte (Ziele) , sind in den USA und beinhalten alle dazugehörigen Pension, wo MilesFromNearestAirport > 5
Die syntax nicht kompilieren, aber ich hatte gehofft, für etwas ähnliches wie das unten
var dests = context.Destinations
.Where(d => d.Country == "USA" && d.Lodgings.Where(l => l.MilesFromNearestAirport > 5))
.Select(d => d)
.ToList();
Irgendwelche Ideen?
Die Option ist gültig.
Der Ansatz ist falsch, weil der left join. Müssen Sie etwas tun, wie: .Where(d => d....Country == "USA" && (d....Unterkünfte.Count == 0 || d....Unterkünfte.Jede(l => l.MilesFromNearestAirport == null || l.MilesFromNearestAirport > 5)) Diese abrufen sollen, die richtigen Standorte. Beim Zugriff auf die Unterkünfte, die jeweils den gleichen Ausdruck in den Unterkünften where-Klausel müssen verwendet werden, um die geltenden Unterkünfte. Soweit ich weiß, entity framework unterstützt nur den inner join. Auf einer anderen Anmerkung, diese Abfrage wäre ziemlich einfach in nhibernate.
Keine dieser Lösungen arbeiten. Shelakel, haben Sie NHibernate viel? Würde dir empfehlen es über EF?
Einfach nur neugierig...warum tun Sie müssen .Wählen Sie(d => d) hier. Wenn Sie diese entfernen, es ist nur ein einfacher lambda-Ausdruck und funktionieren könnte. Noch ein kurzer f: Es hängt von persönlichen Vorlieben, aber man könnte schließen Sie die Klammern am && Teil und ersetzen Sie das && mit anderen .Where(...).
Seine eine Weile her, seit ich dieses schrieb, aber mein ursprünglicher code hat nicht funktioniert und ich war nur zu lernen, Linq, also bitte ignorieren! Wahrscheinlich würde ich nun eine Art von groupjoin mit einer where-Klausel für null & > 5. Das original Auswählen(d => d) scheint ziemlich sinnlos von mir 😉
Der Ansatz ist falsch, weil der left join. Müssen Sie etwas tun, wie: .Where(d => d....Country == "USA" && (d....Unterkünfte.Count == 0 || d....Unterkünfte.Jede(l => l.MilesFromNearestAirport == null || l.MilesFromNearestAirport > 5)) Diese abrufen sollen, die richtigen Standorte. Beim Zugriff auf die Unterkünfte, die jeweils den gleichen Ausdruck in den Unterkünften where-Klausel müssen verwendet werden, um die geltenden Unterkünfte. Soweit ich weiß, entity framework unterstützt nur den inner join. Auf einer anderen Anmerkung, diese Abfrage wäre ziemlich einfach in nhibernate.
Keine dieser Lösungen arbeiten. Shelakel, haben Sie NHibernate viel? Würde dir empfehlen es über EF?
Einfach nur neugierig...warum tun Sie müssen .Wählen Sie(d => d) hier. Wenn Sie diese entfernen, es ist nur ein einfacher lambda-Ausdruck und funktionieren könnte. Noch ein kurzer f: Es hängt von persönlichen Vorlieben, aber man könnte schließen Sie die Klammern am && Teil und ersetzen Sie das && mit anderen .Where(...).
Seine eine Weile her, seit ich dieses schrieb, aber mein ursprünglicher code hat nicht funktioniert und ich war nur zu lernen, Linq, also bitte ignorieren! Wahrscheinlich würde ich nun eine Art von groupjoin mit einer where-Klausel für null & > 5. Das original Auswählen(d => d) scheint ziemlich sinnlos von mir 😉
InformationsquelleAutor orangesherbert | 2012-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @Sampath sagt, diese erfolgt in der Regel mit navigation Eigenschaften, aber ich glaube, dass sein code nicht genau das tun, was Sie wollen. Diese (glaube ich) ist näher:
Aber noch nicht das tun, was Sie wollen, wenn ich Ihre Anforderung auf den Brief. Sie wollen die Lage mit der Wohnung enthalten, D. H. die Navigations-Eigenschaften teilweise geladen. Dies kann praktisch sein, wenn die Entitäten sind, werden serialisiert und an einen (web -) client in einem Paket. (Obwohl die oben genannte Methode wäre OK für das auch).
Aber es ist möglich, eine Sammlung mit teilweise geladen Navigations-Eigenschaften.
Dem Buch, auf Seite 40 zeigt, wie Sie teilweise laden Sie navigation Eigenschaften einer einzelnen Entität (kurz:
context.Entry(entity).Collection(e => e.Children).Query().Where(condition)
. Aber wie gesagt, das ist nur ein Beispiel. Es ist nicht die beste Methode zu tun, die für eine Sammlung von Entitäten.Das lustige an der Sache ist (wie ein Kollege von mir herausgefunden), können Sie leicht tun Sie es für eine Sammlung von Entitäten, die durch das laden der erforderlichen Elemente aus der Sammlung in den Kontext getrennt:
Nun, wenn Sie eine Schleife durch
context.Destinations.Where(d => d.Country == "USA")
Sie werden sehen, dass Ihre Unterkünfte sind geladen mit den ">5
". Wahrscheinlich, weil an dieser Stelle EF ausgeführt Beziehung Korrektur. (Lazy loading deaktiviert, weil lazy loading wird vollständig laden Sie die Navigations-Eigenschaften).Bearbeiten (nach deinem Kommentar)
Ich konnte nicht mehr Zustimmen, wenn Sie sagen, es ist ein bisschen ein hack. Tatsächlich, ich vergaß zu erwähnen, dass in den ersten Platz. Das problem ist, dass der ganze Mechanismus zusammenbricht, wenn lazy loading passiert, um aktiviert zu werden, von jemandem, der nicht bewusst von dem, was der code ist für. Ich weiß nicht, wie code, der abhängig vom Zustand in einer Weise, die nicht offensichtlich sind. Also ich würde lieber immer der erste Ansatz.
Zu sagen, dass ich verbessert haben, die Ihren code leicht durch entfernen der var-Unterkünfte und austauschen .ToList() Load (), da ich denke, dass ist alles, was ich brauche. Ein wenig glücklicher mit ihm nun tatsächlich.
Oh, und ich hatte zu löschen, das Schlüsselwort virtual zum ausschalten lazy loading (wie Sie sagte)
Auch, was sind Ihre Gedanken über die Verwendung von gespeicherten Prozeduren, die für diesen Zweck eher als entity framework?
Zustimmen!!! Wenn dies ist etwas, das performance-und Kleinschreibung könntest du überlegen, eine gespeicherte Prozedur. Ich würde mich nicht dafür entscheiden, zu schnell, denn am Liebsten hätte ich eine code-Basis. Natürlich, wenn es mehr sprocs, könnte es eine sinnvolle option sein.
InformationsquelleAutor Gert Arnold
Normalerweise ist dies getan mit navigation Eigenschaften, die geladen werden, wenn man die entity.
Aber Sie können auch tun dies mit dem folgenden:
Ich hoffe das hilft dir.
InformationsquelleAutor Sampath
Wie über die Verwendung der LINQ beitreten?
InformationsquelleAutor Rune FS