Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[erledigt] EF4, Filtern von Daten, LINQ
kat_2403
myCSharp.de - Member



Dabei seit:
Beiträge: 240

Themenstarter:

[erledigt] EF4, Filtern von Daten, LINQ

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
kat_2403
myCSharp.de - Member



Dabei seit:
Beiträge: 240

Themenstarter:

beantworten | zitieren | melden

Super danke danke.
Das ist genau, was ich gesucht habe.
Danke.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

Zitat von Grumbler85
Du kannst natürlich auch .Contains() anstatt == verwenden ;)
Und besser Equals statt ==; siehe mein Edit :)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
kat_2403
myCSharp.de - Member



Dabei seit:
Beiträge: 240

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
kat_2403
myCSharp.de - Member



Dabei seit:
Beiträge: 240

Themenstarter:

beantworten | zitieren | melden

Ich werd mich mal durch das LINQ Tutorial wühlen, da ist bestimmt was dabei.
Danke.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
kat_2403
myCSharp.de - Member



Dabei seit:
Beiträge: 240

Themenstarter:

beantworten | zitieren | melden

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

Danke.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
kat_2403
myCSharp.de - Member



Dabei seit:
Beiträge: 240

Themenstarter:

beantworten | zitieren | melden

Yup, werd ich tun.
private Nachricht | Beiträge des Benutzers