2016-04-11 2 views
1

私はconveryにC#LINQ joinへのSqlクエリをしようとしています。私は試みましたが、私はこれを達成できませんでした。 SQLのこの対応するクエリはそのままで動作します:C#でLinqを使ってSqlで条件付き結合を行うには?

SELECT pj01.CLID from us20 
INNER JOIN pj01 ON pj01.PJID = 
( 
    CASE 
    WHEN (us20.BKNM = 'PJID') 

    THEN us20.BKID 

    WHEN (us20.BKNM = 'PSID') 

    THEN 
    (
     SELECT PJID FROM pj02 WHERE CLID = us20.CLID AND PSID = us20.BKID 
    ) 
    END 
) 

動作しません。私のLINQの試み、 - データが付属していません:

var result = 
     from us20 in Us20Repository.GetAll() 
     join pj01 in Pj01Repository.GetAll() on new 
     { 
      PJID = 
      (us20.BKNM == "PJID" ? 
        us20.BKID : 
        (
         us20.BKNM == "PSID" ? 
         (
         (from pj02 in Pj02Repository.GetAll() 
         where 
           pj02.CLID == us20.CLID && 
           pj02.PSID == us20.BKID 
         select new 
         { 
           PJID = pj02.PJID 
         }).First().PJID 
        ) : 
         "" 
        ) 
      ) 
     } equals new { PJID = pj01.PJID } 
     select new 
     { 
      CLID = pj01.CLID 
     }; 

はどうすればこれを行うことができますか?これは可能ですか?

+0

クエリが生成されたら、 'result'にカーソルを合わせて生成したSQLを表示できますか? – Rob

+0

SQLクエリで23,000行のデータ(data = "100")、Linq:0 –

+0

私は結果が*実現される*前のことを意味しました。それはあなたにSQLを表示するはずです( 'ToList()'やその他のマテリアライゼーションメソッドを呼び出さないでください)。それを 'IQueryable'のままにして、それを調べます。 – Rob

答えて

0

これは構文例です。それは完全にクエリが結果を返さないように私には理にかなっている理由である、巧妙なEquals実装をサポートしますが、単純にObject.Equalsを使用していない、これはデフォルトで

dbContext.SourceTable   // source 
         .Join(dbContext.TargetTable,   // target 
             source=> source.Id,   // FK 
             target=> target.Id, // PK 
             (source, target) => new { source= source,target=target}).Where(x=>x.source.somefield!=x.target.somefield) // project result 
            .Select(x => x.source); //the output 
+1

OPは定期的に参加する方法を知っています。この場合、結合はキーを指定するより複雑です。条件付きです。 – Rob

+0

私はちょうどLinq –

0

匿名型を助けることを願っています。これは、LINQ-ProviderがクエリをSQLに変換するのに失敗し、ローカルで結合を実行する場合は、完全に合理的です。

var result = 
    from us20 in Us20Repository.GetAll() 
    join pj01 in Pj01Repository.GetAll() on 
     (us20.BKNM == "PJID" ? 
       us20.BKID : 
       (
        us20.BKNM == "PSID" ? 
        (
        (from pj02 in Pj02Repository.GetAll() 
        where 
          pj02.CLID == us20.CLID && 
          pj02.PSID == us20.BKID 
        select new 
        { 
          PJID = pj02.PJID 
        }).First().PJID 
       ) : 
        "" 
       ) 
     ) 
    equals pj01.PJID 
    select new 
    { 
     CLID = pj01.CLID 
    }; 
+0

残念ながらあなたに言った –