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
Entity Framework 4: laden von "related Objects" ... aber gefiltert
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

Themenstarter:

Entity Framework 4: laden von "related Objects" ... aber gefiltert

beantworten | zitieren | melden

verwendetes Datenbanksystem: <MSSQL 2008>

Hi!

Ich hab ein kleines Problem mit dem EF und komm einfach nicht dahinter...


Ich 2 Tabellen in der DB

Entry
- EntryId
- Activ
- Name
- ...

Entry_Translation
- EntryTranslationId
- EntryId (FK)
- Culture
- Title
- Description
- Url
- ...

Im EDM ist durch die FKs alles so gemappt wie es auch sein soll...

So nun möchte ich einen Entry-Datensatz mit der Translation für "de" abfragen.
und es werden aber immer alle Translation - Datensätze für den Entry-Datensatz zurückgegeben...


string Culture = "de";

var result = from c in db.Entries.Include("Entry_Translations")
                         where c.EntryId == 4711
                              && c.Active == true
                              && c.Entry_Translations.Any(e => e.Culture == Culture)
                          select c;

            return result.Single();

Das funktioniert aber wie gesagt nicht so wie es soll...

Ich bräuchte 2 Queries:

einen der mir die Entries (1 oder mehrere..je nach where-clause) mit der Übersetzung für die angegebene Culture zurückliefert

und einen der mit den Entry für einen gegebene Url zurückliefert...
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 620
Herkunft: Schweiz

beantworten | zitieren | melden

Hallo [email protected]

Wenn ich Dich richtig verstehe sollte folgendes funktionieren :

string Culture = "de";

var result = from c in db.Entries.Include("Entry_Translations")
                         where c.EntryId == 4711
                              && c.Active == true
                              && c.Entry_Translations.Culture == Culture
                          select new { EntryId = c.EntryID, Culture = c.Entry_Translations.Culture, Translation = c.Entry_Translations.Title, URL = c.Entry_Translations.Url };

return result;



Wenn nicht, was genau ist die Ausgabe von diesem LINQ Statement und was genau brauchst du ?


Edit :

-> Wäre es nicht ev. "besser" die Übersetzungen als RESX zu hinterlegen ?
---> KEIN DB Zugriff
---> Easy Handling
---> etc. etc. etc.



Beste Grüsse

Diräkt
private Nachricht | Beiträge des Benutzers
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

Themenstarter:

beantworten | zitieren | melden

Hi,

nein das funktioniert so leider nicht...

Entry_Translations ist ja eine Collection...

und das mit den Übersetzungen als resx geht auch nicht, da
es sich ja auch um ein ganz anderes thema handeln könnte.

Beispiel mal auf ein Messageboard übertragen...

Entry ==> Board
Entry_Translation ==> Threads

Jetzt hab ich eine Navigation-Property Threads
über load() oder include bekomme ich die Datensätze jeweils in
mein Board-Objekt.

Nun möchte ich aber nicht alle Threads in einem Board "ausgeben lassen" sondern
nur die Threads die nicht gelöscht wurden.

[pseudo-code]
gib mir das Message-Board mit der Id 13 und inkludiere alle Threads die nicht gelöscht wurden.... bitte ...
[/pseudo-code]

Um das also über die Navigation-Property zu lösen müsste es möglich sein das "include" oder "load" zu filtern aber nur wie und wenn das so gar nicht möglich ist, wie macht man das sonst?
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 620
Herkunft: Schweiz

beantworten | zitieren | melden

Hallo [email protected]


Entry -> Entry_Translation (1:N)
Zitat
gib mir das Message-Board mit der Id 13 und inkludiere alle Threads die nicht gelöscht wurden.... bitte unglücklich ...

 var query = (rom c in db.Entries
                        where c.EntryId == 4 && c.Active==true
                        select c.EntryID).FirstOrDefault();


var result = query.Entry_Translations.Where(t=>t.Entry_Translations.EntryID);


Sollte funktionieren ?!
(Die Entry_Translation führen dann wohl auch die Board ID ... ?!)

Beste Grüsse

Diräkt
private Nachricht | Beiträge des Benutzers
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

Themenstarter:

beantworten | zitieren | melden

ah ok...

also in einem Query geht das dann wohl nicht ... hmmm.
mit mehreren Queries wird das jetzt etwas mühsam...
ich dachte dass das mit ein query geht und dann sowas gehen würde...



<% foreach(Entry e in repository.GetEntries()) { %>

<%: e.Entry_Translation.First().MenuTitle %>

<% } %>


oder



<% foreach(Board b in repository.GetBoardsWithActiveThrea()) { %>

<%: b.Threads.Count() %>

<% foreach(Thread th in b.Threads) { %>

//gib mir jeden thread aus...

<% } %>

<% } %>

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von [email protected] am .
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 620
Herkunft: Schweiz

beantworten | zitieren | melden

Hallo [email protected]


Doch das ist möglich, hatte gestern nur den Kopf voller Bier ;-)


  var query = (from c in db.Entries
                        where c.EntryId == 4 && c.Active==true
                        select new{ID=c.EntryId, Translations=c.Entry_Translations.Where(t=>t.Entry.EntryId==c.EntryId)}; 

Hoffe das hilft Dir !

Beste Grüsse

Diräkt
private Nachricht | Beiträge des Benutzers