2016-08-12 15 views
1

LEFT OUTER JOINを複数入力してOracle SqlクエリをLINQに変換する際に問題があります。私の試みは、期待される結果を返さない。誰かが下のSQLクエリをLINQに変換する手助けをすることができます。SQL(左外部結合)をLINQに変換する

string currentCulture = Culture.GetCulture(); 
string query = @"SELECT * 
       FROM CTGLBL g, CTTGLBL ct, CTLANG lang 
       WHERE g.sysctglbl = ct.sysctglbl(+) AND 
        ct.sysctlang = lang.sysctlang (+) AND 
        NVL(lang.activeflag, 1)= 1 AND 
        (ISOCODE LIKE '" + currentCulture + "%' OR ISOCODE IS NULL)"; 

ISOCODEはCTLANGテーブルに属します。

ps。私はLINQPADやLinqerのようなツールを使うことはできません。

+0

'ISOCODE'はどのテーブルに属していますか? –

+0

これはCTLANG – Devid

+0

に属し、 '(+)'とは何ですか、これは本当に正しい結合ではありません....これはwhere節を介して行われる通常の結合です.. –

答えて

2

しかし、あなたのSQLのためのより良い練習(とここでLINQに変換)テーブルではなくwhereに参加するjoinを使用することです:

string currentCulture = Culture.GetCulture(); 

var result = from g in CTGLBL 
      join ct in CTTGLBL on g.sysctglbl equals ct.sysctglbl into ctj 
      from ct in ctj.DefaultIfEmpty() 
      join lang in CTLANG on ct.sysctlang equals lang.sysctlang into langj 
      from lang in langj.DefaultIfEmpty() 
      where (lang == null ? 1 : (lang.activeflag ?? 1)) == 1 && 
       (lang?.ISOCODE.StartsWith(currentCulture) || lang?.ISOCODE == null) 
      select new { g, ct, lang }; 

ます。また、このようなあなたのCTLANGため"nested select"を持つことができます。

string currentCulture = Culture.GetCulture(); 

var result = from g in CTGLBL 
      join ct in CTTGLBL on g.sysctglbl equals ct.sysctglbl into ctj 
      from ct in ctj.DefaultIfEmpty() 
      join lang in CTTGLBL.Where(lang => lang.activeflag ?? 1 == 1 && 
                (lang.ISOCODE.Contains(currentCulture) || 
                lang.ISOCODE == null)) 
      on ct.sysctlang equals lang.sysctlang into langj 
      from lang in langj.DefaultIfEmpty() 
      select new { g, ct, lang }; 
+0

ありがとう、今すぐ試してみてください。 ISOCODEはテーブルCTLANGに属します。 – Devid

+1

@Devid - 左の結合を行うために訂正されたクエリ –

+0

おかげさまで、チャットに自分のテーブルの画像をいくつか追加しました。それは少し明確になることを願っています。 – Devid

2

(私は何を見ることはない右、左結合である)

あなたが適切なrelatを持っていると仮定するとあなたのスキーマ内のテーブル間で、SQL Server(Linq TO SQL)を使用すると、Oracleでサポートされるかどうかは分かりません。

string currentCulture = Culture.GetCulture(); 

var data = from g in db.CTGLBL 
      from ct in g.CTTGLBL.DefaultIfEmpty() 
      from lang in g.CTLANG.DefaultIfEmpty() 
      where !g.CTLANG.Any() || 
       (lang.activeflag == 1 && 
        lang.ISOCODE.StartsWith(currentCulture)) 
      select new {g, ct, lang}; 
関連する問題