Laden...

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

Erstellt von M@TUK vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.010 Views
M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 13 Jahren
Entity Framework 4: laden von "related Objects" ... aber gefiltert

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...

D
615 Beiträge seit 2009
vor 13 Jahren

Hallo M@tuk

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

M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 13 Jahren

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?

D
615 Beiträge seit 2009
vor 13 Jahren

Hallo M@tuk

Entry -> Entry_Translation (1:N)

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

M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 13 Jahren

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...

<% } %>

<% } %>


D
615 Beiträge seit 2009
vor 13 Jahren

Hallo M@tuk

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