Sql 使用方法语法的LINQ中的JOIN和LEFT JOIN等价
我正在将一个SQL查询转换为LINQ,它创建一个具有1对1映射的左连接,并且必须使用方法语法。我一直在努力做到这一点。我可以用Lambda语法来做。下面是我尝试运行的示例查询。它们不是实际的代码。有人能指出我做错了什么吗 SQL: 林克: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
加入。。。进入
成为一个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();