verwendetes Datenbanksystem: <MSSQL2008R2>, EF4
Hallo,
ist es möglich via einem JOIN (spannender wie), die Daten in meinem Entity Framework Kontext über mehrere Referenzen zu filtern.
Beispiel:
ObjectParameter param = new ObjectParameter(
"p", "%" + keyword + "%");
// Abfrage auf Beschreibung
ObjectQuery<Buch> beschrQuery =
context.BuchBeschreibung.Where("it.Beschreibung Like @p", param);
Das passt soweit, also hole mir alle Bücher, die xyz Beschreibungstext beinhalten.
Jetzt hab ich aber noch ein anderes Referenzobjekt, BuchKritik. Buchkritik hat auch zwei Properties: BEM1, BEM2 z.B. Jetzt möchte ich also haben:
Hole mir alle Bücher, die in Buch.Beschreibung xyz Wert haben ODER in Buchkritik.BEM1 xyz haben ODER in Buchkritik.BEM2 xyz haben.
Geht so etwas mit LINQ?
Danke.
Wenn es eine Relation zwischen Buch.Beschreibung und Buchkritik gibt kannst Du das direkt über einen Query machen.
Ob hierbei ein JOIN verwendet wird, entscheidetet LINQ selbst.
var buecherQuery = context.Buecher.Where( buchEntity => buchEntity.BuchBeschreibung.Beschreibung == "Beschreibung" || buchEntity.BuchKiritik.BEM1.Equals("bla")|| buchEntity.BuchKiritik.BEM2.Equals("bla") || buchEntity.BuchKiritik.BEM3.Equals("bla") );
Das sind aber irgendwie schon Grundlagen.
Siehe auch 101 LINQ Samples
PS: gewöhn Dir Repositories an.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ergänzung, da Abt schneller war:
Du kannst natürlich auch .Contains() anstatt == verwenden 😉
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
(
Du kannst natürlich auch .Contains() anstatt == verwenden 😉 Und besser Equals statt ==; siehe mein Edit 😃){gray}
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
ganz so funktioniert das dann doch nicht:
var buchQuery =
context.Bucher.Where(
b => b.Bezeichnung.Contains(keyword) ||
b.Verarbeitung.Contains(keyword) ||
b.Buchkritik.Where(a => a.BEM1.Contains(keyword)));
Ich dachte so würde das evtl gehen. Zwischen Buch und Buchkritik gibt es eine 1:n Beziehung. Tut es aber nicht.
Wenn ich das Beispiel von Abt nehme, kann ich nicht direkt auf buchEntity.BuchKiritik.BEM1 zugreifen. Hmmmm.
Danke.
Ich werd mich mal durch das LINQ Tutorial wühlen, da ist bestimmt was dabei.
Danke.
Wenn Buchkritik 1:n zu buch ist muss es etwas anders aussehen:
context.Bucher.Where(
b => b.Bezeichnung.Contains(keyword) ||
b.Verarbeitung.Contains(keyword) ||
b.Buchkritik.Any(a => a.BEM1.Contains(keyword)));
Das Problem ist, dass das äußere Where nur Boolean erwartet, dein inneres Where aber IEnumerable<Buchkritik> ist. .Any() prüft hingegen auf Existenz.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
Bitte befasse Dich trotzdem mit den Grundlagen von LINQ; denn die Fragen hier sind definitiv auf eine sehr simplen Ebene. Danke.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code