左连接的Linq表达式和内部表的过滤器

时间:2012-06-07 10:43:11

标签: linq join subquery left-join

我想知道如何使Linq表达式与这些SQL查询具有相同的效果

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

我已经使用Method查询创建它,但我不知道它是否会产生相同的结果

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 个答案:

答案 0 :(得分:1)

首先你的sql查询。它是有效的内连接,因为where条件将过滤掉来自priceforitem的数据为空的所有行。如果你想将同一个查询转换为linq,你可以这样做 来自db.Items中的i

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表达式。