2016-11-23 9 views
0

LINQで少し弱いと言って申し訳ありませんが、複雑なLINQの作業を開始する前にSQLクエリを作成します。LINQ複数のON OR条件で左結合

私はどのようにORオペレータとconditons ON複数でLEFT JOINとLINQには、このSQLクエリを変換することをお願いしたいと思います。、

m.MerchandiseIdがONの状態での二回に使用

SELECT 
    * 
FROM 
    Inbox AS i 
    INNER JOIN [User] AS u ON i.FromUserId = u.UserId 
    LEFT OUTER JOIN Merchandise AS m ON 
     u.MerchandiseId = m.MerchandiseId 
     OR 
     i.ToMerchantId = m.MerchandiseId 
WHERE 
    i.ToCompanyId = 10 
    OR 
    i.FromCompanyId = 10 



var message = (from i in db.Inbox 
       join u in db.User on i.FromUserId equals u.UserId 
       join m in db.Merchandise on u.MerchandiseId equals m.MerchandiseId //here I want to ON i.MerchantId = m.MerchandiseId, but it doesn't allow 
       where i.ToCompanyId == user.CompanyId || i.FromCompanyId == user.CompanyId 
       orderby i.CreatedAt descending 
       group m.MerchandiseId by new { m.MerchandiseId, m.MerchandiseName } into grp 
       select new 
       { 
         MerchandiseId = grp.Key.MerchandiseId, 
         MerchandiseName = grp.Key.MerchandiseName, 
         InboxMessage = (from e in db.Inbox 
             join us in db.User on e.FromUserId equals us.UserId 
             join mer in db.Merchandise on us.MerchandiseId equals mer.MerchandiseId 
              where mer.MerchandiseId == grp.Key.MerchandiseId 
              orderby e.CreatedAt descending 
              select e.InboxMessage).FirstOrDefault(), 
         CreatedAt = (from e in db.Inbox 
            join us in db.User on e.FromUserId equals us.UserId 
            join mer in db.Merchandise on us.MerchandiseId equals mer.MerchandiseId 
            where mer.MerchandiseId == grp.Key.MerchandiseId 
            orderby e.CreatedAt descending 
            select e.CreatedAt).FirstOrDefault(), 
             }).ToList(); 
になります

私はそれのために書く下のLINQクエリ。しかし、私はちょうどLINQで複数のON句で左結合に取り組むことができます。誰かが私を助けてくれたら大丈夫です。ありがとう!

+0

それはLINQのは、あなたが複数の 'AND'、ない' OR'を持っているにリンクされているクエリを実行することを、重複しない@Sherlock。 – Dai

+0

@Dai私は重複したサントシング・シングが私にはそれほどコメントしていないと言っていません:)私に心臓発作を与えてはいけません。そしてリンクは、何が起こっているのか理解できるように、私たちは手を汚す必要があります – Sherlock

+0

@Sherlockは正しくクエリをチェックアウトしますが、私はstackoverflowで多くのソリューションを見つけることができませんし、私はちょうどここにそれを投稿したので、それは重複しません。 – jefferyleo

答えて

4

Linqは複数の列を持つOR演算子の使用をサポートしているとは思っていませんが、それは結合の意図を不明瞭にし、データがどこから生じたのかを隠すためSQLではORを使用しません - 各列に複数の一致がある場合、どうなるかはすぐに分かりません。代わりに、私は別の列に二回JOINと投影句がそれを処理できるようになります。

これは、あなたが使用している場合( How to implement left join in JOIN Extension method

なおLEFT OUTER JOINアプローチを使用してLINQのに変換することができます

SELECT 
    * 
FROM 
    Inbox 
    INNER JOIN [User] AS u ON i.FromUserId = u.UserId 
    LEFT OUTER JOIN Merchandise AS userMerchant ON u.MerchandiseId = userMerchant.MerchandiseId 
    LEFT OUTER JOIN Merchandise AS inboxMerchant ON Inbox.ToMerchantId = inboxMerchant .MerchandizeId 
WHERE 
    Inbox.ToCompanyId = 10 
    OR 
    Inbox.FromCompanyId = 10 

Entity Frameworkを使用している場合は、これを行うことについてまったく心配する必要はありません。ただ、Includeを使用します。

var query = db.Inbox 
    .Include(i => i.User) 
    .Include(i => i.User.Merchandise) 
    .Include i => i.Merchandise) 
    .Where(i => i.ToCompanyId = 10 || i.FromCompanyId == 10); 
+1

+ EFの部分については、私はこれを知らなかった:)また、linqクエリまたはlinq拡張子EF – Sherlock

+0

せずにそれを翻訳することができるかどうかを見ても興奮して、あなたがlinqクエリに変換することができれば同じ@Sherlockに行く、それは最高だろう – jefferyleo

+0

@Sherlockそれも可能ですが、明日は知的挑戦のためにそれを刺すつもりです。私はいつも "ネイティブ" Linqよりも拡張メソッド - 構文を好むことに注意してください。 – Dai