Frage

Angesichts der folgenden Tabellen möchte ich den lokalisierten Text für eine bestimmte Kultur oder den Text für die Standardkultur zurückgeben, in der keine Zeile für die gegebene Kultur existiert.

Diagram http://lh4.ggpht.com/_gjscwav_czc/shw6hc-eozi/aaaaaaaaacby/mxabfiztby8/s400/diagram.png

Also mit den lobenden Daten

Ressourcen

ID  Name
1   Donkey
2   Elephant

Lokale

ID  CultureID  ResID   LocaleText
1   1         1       Donkey
2   1         2       Elephant
3   2         1       baudet

Ich möchte in der Lage sein, Folgendes für die französische Kultur zurückzubringen

baudet
elephant

Ich habe verschiedene Abfragen ausprobiert, die auf linken Anschlussproben basieren, die ich gesehen habe, aber ich stecke fest.

var ct = from r in db.Resources
                 join lt in db.LocaleStrings
                     on r.ID equals lt.ResID into res
                 from x in res.DefaultIfEmpty()
                 select new
                 {
                     CultureID = x.CultureID,
                     LocaleText = x.LocaleText,
                     ResID = x.ResID
                 };

        var text =
            from c in db.Cultures
            join t in ct
            on c.ID equals t.CultureID into cults
            from x in cults.DefaultIfEmpty()
            select x;
War es hilfreich?

Lösung

Ich bin sicher, es gibt einen besseren Weg, aber das scheint zu funktionieren:

    var ct =
        from c in db.Cultures
        from l in db.LocaleStrings
        from r in db.Resources
        where r.ID == l.ResID
        select new
        {
            CultureID = c.ID,
            LocaleText = l.CultureID == c.ID ? l.LocaleText : r.Name,
            ResID = r.ID,
            LSID = l.CultureID == c.ID ? l.ID : 0
        };

    var text =
        from t in ct
        where t.LSID != 0 || (t.LSID == 0 && !((from ac2 in ct
                                                where ac2.LSID > 0 && ac2.CultureID == t.CultureID
                                                select ac2.ResID).Contains(t.ResID)))
        select new
        {
            CultureID = t.CultureID,
            LocaleText = t.LocaleText,
            ResID = t.ResID
        };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top