Laden...

[erledigt] EF4, Filtern von Daten, LINQ

Erstellt von kat_2403 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.459 Views
K
kat_2403 Themenstarter:in
236 Beiträge seit 2007
vor 11 Jahren
[erledigt] EF4, Filtern von Daten, LINQ

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.

16.807 Beiträge seit 2008
vor 11 Jahren

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.

G
538 Beiträge seit 2008
vor 11 Jahren

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)

K
kat_2403 Themenstarter:in
236 Beiträge seit 2007
vor 11 Jahren

Super danke danke.
Das ist genau, was ich gesucht habe.
Danke.

16.807 Beiträge seit 2008
vor 11 Jahren

(

Du kannst natürlich auch .Contains() anstatt == verwenden 😉 Und besser Equals statt ==; siehe mein Edit 😃){gray}

K
kat_2403 Themenstarter:in
236 Beiträge seit 2007
vor 11 Jahren

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.

K
kat_2403 Themenstarter:in
236 Beiträge seit 2007
vor 11 Jahren

Ich werd mich mal durch das LINQ Tutorial wühlen, da ist bestimmt was dabei.
Danke.

G
538 Beiträge seit 2008
vor 11 Jahren

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)

K
kat_2403 Themenstarter:in
236 Beiträge seit 2007
vor 11 Jahren

Läuft ... Tausend Dank, auch für den Link.

Danke.

16.807 Beiträge seit 2008
vor 11 Jahren

Bitte befasse Dich trotzdem mit den Grundlagen von LINQ; denn die Fragen hier sind definitiv auf eine sehr simplen Ebene. Danke.

K
kat_2403 Themenstarter:in
236 Beiträge seit 2007
vor 11 Jahren

Yup, werd ich tun.