2012-06-07 57 views
0

我想知道如何使具有這些SQL查詢LINQ表達式爲左連接和內表濾波器

SELECT item.*, priceforitem.* 
FROM 
    item 
    LEFT JOIN priceforitem 
    ON priceforitem.ItemID = item.ItemID 
    AND priceforitem.PriceID = ?PriceID 

我使用它的方法查詢,但我不已經做出同樣的效果LINQ表達式「知道這是否會產生同樣的結果

db.Items 
    .GroupJoin(
     db.PriceForItems.Where(pi => pi.PriceID == id), 
     i => i.ItemID, 
     pi => pi.ItemID, 
     (i, pi) => new { Item = b, Prices = pi }) 
    .SelectMany(
     a => a.Prices.DefaultIfEmpty(), 
     (i, pi) => new 
     { 
      ItemID = i.Item.ItemID, 
      Code = i.Item.Code, 
      Name = i.Item.Name, 
      PriceForItemID = pi.PriceForItemID, 
      Price = pi.Price 
     }) 

,然後思考了一段時間後,我縮短這樣

db.Items 
    .SelectMany(
     i => db.PriceForItems.Where(
      pi => pi.PriceID == id 
       && pi.ItemID = i.ItemID).DefaultIfEmpty(), 
     (i, pi) => new 
     { 
      ItemID = i.Item.ItemID, 
      Code = i.Item.Code, 
      Name = i.Item.Name, 
      PriceForItemID = pi.PriceForItemID, 
      Price = pi.Price 
     }) 

我是Linq的新手,我不知道哪個更好,以及如何將其轉換爲Linq查詢語句。

回答

1

首先你的sql查詢。它是有效的內連接,因爲where條件會過濾掉priceforitem中的數據爲空的所有行。如果你想轉換成相同的查詢LINQ,你可以不喜歡它 從我db.Items

join p in db.PriceforItems on 
i.ItemId equals p.ItemId into tempvals 
from t in tempvals.DefaultIfEmpty() 
where t.PriceId == id 
select new{i.ItemId, ..., t.PriceId, t...., t....} 

我大多寫LINQ查詢,而不是在那裏他們更可讀我的表情。如果你仍然想得到一個表達式,你可以寫一個有效的linq查詢並將其粘貼到Linqpad,它會給出結果以及查詢的lambda表達式。

+0

我只是不確定'where t.PriceId == id'部分,它是否會通過過濾'temp'影響結果行,其'tempvals'爲空。 「where」的運算符優先級是否大於第二個「from」?我擔心它會有同樣的結果,如果我的第一個SQL查詢與最後的'AND priceforitem.PriceID =?PriceID'替換爲'WHERE priceforitem.PriceID =?PriceID'。 – qsoft

+0

'tempments.template.DefaultIfEmpty()'中的t用於外連接,'when'用於過濾結果。 –