【问题标题】:Linq expression for left join and filter for the inner table用于内表的左连接和过滤器的 Linq 表达式
【发布时间】:2012-06-07 10:43:11
【问题描述】:

我想知道如何制作和这些SQL查询一样效果的Linq表达式

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

我已经使用方法查询完成了,但我不知道它是否会产生相同的结果

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

【问题讨论】:

    标签: linq join subquery left-join


    【解决方案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 表达式。

    【讨论】:

    • 我只是不确定where t.PriceId == id 部分是否会通过过滤掉ttempvals 为空的t 来影响结果行。 where的运算符优先级是否大于第二个from?我担心它会得到与我的第一个 SQL 查询相同的结果,其中最后一个 AND priceforitem.PriceID = ?PriceID 替换为 WHERE priceforitem.PriceID = ?PriceID
    • from t in tempvals.DefaultIfEmpty() 用于外连接,when 用于过滤结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 2016-03-04
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多