2012-06-07 28 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'用于过滤结果。 –