0

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

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 查询语句。

4

1 回答 1

0

首先你的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 表达式。

于 2012-06-07T11:29:55.700 回答