Sql 使用方法语法的LINQ中的JOIN和LEFT JOIN等价

Sql 使用方法语法的LINQ中的JOIN和LEFT JOIN等价,sql,linq,entity-framework,Sql,Linq,Entity Framework,我正在将一个SQL查询转换为LINQ,它创建一个具有1对1映射的左连接,并且必须使用方法语法。我一直在努力做到这一点。我可以用Lambda语法来做。下面是我尝试运行的示例查询。它们不是实际的代码。有人能指出我做错了什么吗 SQL: 林克: 加入。。。进入成为一个GroupJoin,来自的第二个成为一个SelectMany: var linq_query = Item .GroupJoin( item_status.Where(x => x.selected_item

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

SQL:

林克:


加入。。。进入
成为一个
GroupJoin
,来自的第二个
成为一个
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();
它看起来像是
,其中
使左侧外部联接变得不必要,因为空状态将被过滤掉

编辑:否,在查看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而不是非方法语法linq。
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();
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();