我想知道如何使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查询语句。
答案 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表达式。