LINQ zur SQL -Lokalisierungsabfrage
-
23-08-2019 - |
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;
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