2016-08-04 22 views
-1

私はここで少し必死で、いくつかの助けが必要です。私はSQLで経験はありますが、LinqからSQLとEFまで経験はありません。私は、データベースに対してうまく動作するコンセプトクエリーを持っていますが、SQLにLinqに対してそれを書き込もうとすると、必要なものが生成されません。 LinqからSQLへの複数の左外部結合

SELECT P.*, C.*, A.* 
FROM Parent P 
LEFT OUTER JOIN Access A 
ON (A.Field1 IS NULL OR A.Field1 = P.Field1) 
AND (A.Field2 IS NULL OR A.Field2 = P.Field2) 
AND (A.Field3 IS NULL OR A.Field3 = P.Field3) 
AND A.AccessId = 123 
LEFT OUTER JOIN Child ON 
C.Id = P.Id 
AND A.HasAccess = 1 

第一の外側の最後の行に注意してください

参加: とA.AccessId = 123

はこれが必要です。私はここに値をつけることができなければならないし、どこに他の値も入れられなくてはならない。また AND A.HasAccess = 1

そのデータを見ることができるユーザーを制御するために必要:

はまた、最後の外側の最後の行が参加気づきます。

最後に、linqは次のようになります。これは実際の取引から抽象化されているので、私は間違いがあるかもしれないことをご理解ください。私はここで実際の質問を投稿することはできません。

from p in db.Parent 
join a in db.Access 
on 123 equals a.AccessId into a1 
from a2 in a1.Where(
    w => (!w.Field1.HasValue || w.Field1 == p.Field1) 
     && (!w.Field2.HasValue || w.Field2 == p.Field2) 
     && (!w.Field3.HasValue || w.Field3 == p.Field3) 
).DefaultIfEmpty() 
join c in db.Child on p.Id equals c.Id into c1 
from c2 in c1.Where(
    w => c.HasAccess.HasValue && c.HasAccess.Value 
).DefaultIfEmpty() 
select new { ... stuff ... } 

[さらにSOの別の場所に回答を反映するように編集されています。この事は直感的ではありません。:/]

もちろん、これが作成するクエリは不必要に大きく、上記の理由から私はここに投稿できません。だから、誰かが少なくとも概念的な質問に近づくのを助けることができれば、それは非常に高く評価されるだろう。

答えて

0

申し訳ありませんが、この問題の答えが見つかりました。それは私の考えではありませんでした。上記の私の提出された解決策は正しかったが、私のロジックの微妙な欠陥が、私にそれを実現させなかった。残念ながら、私は今新しい問題に取り組んでいます。後でそれを質問します。

関連する問題