0

LINQ で機能させる方法がわからない、非常に基本的な SQL 結合ステートメントがあります。JOIN で OR ステートメントを使用しており、JOIN で AND を使用するコードをオンラインで見つけましたが、私の状況では OR には何の役にも立ちません。

SQLは次のとおりです。

SELECT *
FROM Proposals AS a
LEFT JOIN Proposal_Minions AS b
    ON a.ID = b.Proposal_ID
LEFT JOIN Users AS c
    ON (a.PI_User_ID = c.ID) OR (a.Creator_User_ID = c.ID) OR (b.User_ID = c.ID)
WHERE c.Account = 'myname'

どんな助けでも大歓迎です。

4

2 に答える 2

1

where代わりに使用できますjoin

from a in Proposals
join b in Proposal_Minions on a.ID equals b.Proposal_ID
from c in Users
where a.PI_User_ID == c.ID || a.Creator_User_ID == c.ID || b.User_ID == c.ID
select new { a, b, c }

ただし、これは と同等ですINNER JOIN。によって外部結合効果を得ることができます

from a in Proposals
join b in Proposal_Minions on a.ID equals b.Proposal_ID into j
from pm in j.DefaultIfEmpty()
select new { a, 
             pm,
             c = (from c in Users
                 where a.PI_User_ID == c.ID 
                    || a.Creator_User_ID == c.ID 
                    || pm.User_ID == c.ID
                 select c).FirstOrDefault()
            }

Proposalあなただけができるsを選択したいので

from a in Proposals
join b in Proposal_Minions on a.ID equals b.Proposal_ID into j
from pm in j.DefaultIfEmpty()
where Users.Any(u => a.PI_User_ID == u.ID 
                    || a.Creator_User_ID == u.ID 
                    || pm.User_ID == u.ID)
select a

しかし、これはもはや外部結合ではありませんUsers。一方、両方の外部結合は、Usersとにかくすべてが選択されるProposal_Minionsため、フィルターの目的を無効にします。Proposalsこれは、 の外部結合にも当てはまりますProposal_Minions

于 2013-08-21T18:55:02.810 に答える
1

必要に応じてDBコンテキストに対して生のSQLを実行し、結果を強力なタイプにマップできます(クエリ結果がタイプと一致することを確認してください)。

IEnumerable<YourStronglyTypedTable> myResults = 
dbConext.ExecuteQuery<YourStronglyTypedTable>("Your SELECT query");
于 2013-08-21T18:57:33.500 に答える