2009-05-21 24 views
2

与えられたカルチャのローカライズされたテキストまたは指定されたカルチャの行が存在しない既定のカルチャのテキストを返したいと思います。 folowingデータとそうLinqからSQLへのローカライゼーションクエリ

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

リソース

ID Name 
1 Donkey 
2 Elephant 

LocaleStrings

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

私は思いますLEFTは、私が見てきたサンプルに参加するが、私はこだわっているの周りに、私はベースのさまざまなクエリを試してみた

baudet 
elephant 

フランス文化のために、以下を返すことができるようにしたいです。

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

あなたが実際にクロスは、すべてのリソースを持つすべての文化に合わせて、参加行う必要があります。ここでの左側の結合はフランス語をリソースの1つ(ボーデット)に一致させるため、結合は技術的に空ではありません。 – samiz

答えて

1

私は良い方法があります確信しているが、これは動作するようです:

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