私はここで少し必死で、いくつかの助けが必要です。私は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の別の場所に回答を反映するように編集されています。この事は直感的ではありません。:/]
もちろん、これが作成するクエリは不必要に大きく、上記の理由から私はここに投稿できません。だから、誰かが少なくとも概念的な質問に近づくのを助けることができれば、それは非常に高く評価されるだろう。