【问题标题】:JOIN and LEFT JOIN equivalent in LINQ with Method Syntax使用方法语法在 LINQ 中等效的 JOIN 和 LEFT JOIN
【发布时间】:2012-10-04 17:10:04
【问题描述】:

我正在将一个 SQL 查询转换为 LINQ,该查询创建一个具有 1 对 1 映射的左连接,并且它必须采用方法语法。我一直在扯我的头发,试图做到这一点。我可以在 Lambda 语法中做到这一点。下面是我尝试运行的示例查询。它们不是实际的代码。有人会指出我做错了什么吗?

SQL:

SELECT item.*, item_status.*
FROM item
LEFT JOIN item_status 
    ON item.ID = item_status.itemID
    AND item_status.FLAGGED = true
WHERE item.published_date > "2008-06-19"

LINQ:

var linq_query = (
    from selected_item in item
    join selected_item_status in item_status
        on selected_item.ID equals item_status.itemID into joined
    from item_status in joined.DefaultIfEmpty()
    where item_status.FLAGGED = true
    select new {selected_item, selected_item_status}).ToList();

【问题讨论】:

  • 如果代码不是实际代码,我们如何告诉您代码有什么问题?能否也看看Itemitem_status的类,以及你把匿名类型列表放入的类?

标签: sql linq entity-framework


【解决方案1】:

join ... into 变成 GroupJoin,第二个 from 变成 SelectMany

var linq_query = Item
    .GroupJoin(
        item_status.Where(x => x.selected_item_status.FLAGGED), // EDIT: Where clause moved here.
        selected_item => selected_item.ID,
        selected_item_status => selected_item_status.itemID,
        (selected_item, joined) => new
        {
            selected_item,
            statuses = joined.DefaultWithEmpty(),
        })
    .SelectMany(x => x.statuses.Select(selected_item_status => new
    {
        x.selected_item,
        selected_item_status,
    }))
    // EDIT: Removed where clause.
    .ToList();

看起来Where 使左外连接变得不必要了,因为无论如何都会过滤掉空状态。

编辑:不,在查看 SQL 后,您的 LINQ 查询似乎有点不正确。应该是:

var linq_query = (
    from selected_item in item
    join selected_item_status
        in (
            from status in item_status
            where status.FLAGGED
            select status)
        on selected_item.ID equals item_status.itemID into joined
    from item_status in joined.DefaultIfEmpty()
    select new {selected_item, selected_item_status}).ToList();

【讨论】:

  • 谢谢!我从来没有想过那里的连接表上有 where 子句。
  • 谢谢你 - 我刚刚得到这个答案,这就是我想要的。在我看来,将 where 子句放在那个位置更类似于 SQl,而不是非 Method 语法 linq。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2021-12-20
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2019-07-23
相关资源
最近更新 更多