2009-05-21 9 views
2

Étant donné les tableaux suivants, je voudrais retourner le texte localisé pour la culture donnée ou le texte pour la culture par défaut où aucune ligne n'existe pour la culture donnée.Linq to Sql requête de localisation

diagram http://lh4.ggpht.com/_gjsCWAV_CZc/ShW6hC-eozI/AAAAAAAACbY/mXaBfiZtBY8/s400/diagram.png

Donc, avec les données folowing

Ressources

ID Name 
1 Donkey 
2 Elephant 

LocaleStrings

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

I'D comme être en mesure de retourner les éléments suivants pour la culture française

baudet 
elephant 

J'ai essayé différentes requêtes basées autour GAUCHE REJOINT échantillons que j'ai vu mais je suis coincé.

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; 
+0

Vous devez vraiment faire une jointure croisée pour correspondre à toutes les cultures avec toutes les ressources. La jointure gauche ici correspond au français à l'une des ressources (baudet), donc la jointure n'est pas techniquement vide. – samiz

Répondre

1

Je suis sûr qu'il ya une meilleure façon, mais cela semble fonctionner:

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 
     };