【发布时间】:2021-02-23 17:20:05
【问题描述】:
这是我在这里的第一篇文章,所以如果我有任何问题,请告诉我,我会修复它。
我正在努力将带有左连接的简单 SQL 语句转换为 LINQ 语句(方法语法)。我不能使用 Linquer,因为这是一个 .Net Core 5.0 MVC 项目。
假设我有两个表:
dbo.OrganisationChannel (Id, OrganisationId, ChannelId)
dbo.Channel (Id, ChannelName, ChannelUrl)
我想显示一个组织目前没有的所有频道。
这是正确的 SQL 查询
SELECT c.Id, c.ChannelName, c.ChannelUrl
FROM dbo.Channel c
LEFT JOIN dbo.OrganisationChannel oc ON c.Id = oc.ChannelId
WHERE oc.ChannelId IS NULL OR oc.OrganisationId <> 1
但是,对应的.GroupJoin 和.SelectMany 让我很困惑。我找不到合适的地方添加 WHERE 子句:
var groupItems = db.Channel
.GroupJoin(
db.OrganisationChannel,
c => c.Id,
oc => oc.ChannelId,
(c, oc) => new { c, oc })
.SelectMany(
x => x.oc.DefaultIfEmpty(),
(chan, orgChan) => new
{
Id = chan.c.Id,
ChannelName = chan.c.ChannelName,
ChannelUrl = chan.c.ChannelUrl,
IsActive = chan.c.IsActive,
}
);
如果能得到任何帮助,我将不胜感激,谢谢!
硅
【问题讨论】:
-
尝试以下操作:var groupItems = db.Channel.Where(oc=> oc.ChannelId == DbNull.Value || oc.OrganisationId != 1)
-
你在使用实体框架吗?你可以试试:
var groupItems = db.Channel.Include(x=>x.OrganisationChannels).Where(x=>x.OrganisationChannels.ChannelId == null || x.OrganisationChannels.OrganisationId != 1 -
嗨 Kamalpreet - 是的,我在 .net Core 5.0 MVC 项目中使用 EF Core。
-
嗨 jdweng - OrganisationId 是 OrchanisationChannel 表(右侧表)的一部分,因此在 oc 上下文中不可用。另外,.Where 子句会出现在 GroupJoin 之前还是之后?
-
试试我上面的例子。
标签: c# asp.net-mvc linq asp.net-core