首页 > 解决方案 > 将带有 LEFT JOIN 的 SQL 转换为 Linq(方法语法)

问题描述

这是我在这里的第一篇文章,所以如果我有任何问题,请告诉我,我会修复它。

我正在努力将带有左连接的简单 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

但是,相应的.GroupJoinand.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,
        }
        );

我会很感激这里的任何帮助,谢谢!

标签: c#asp.net-mvclinqasp.net-core

解决方案


检查此网址https://dotnettutorials.net/lesson/left-outer-join-in-linq/

也是我的工作代码示例:

 UserApiKeys
            .Where(w => w.AppID == AppID && w.IsActive)
            .Join(
                    UserApiApplications,
                    keys => keys.AppID,
                    apps => apps.AppID,
                    (keys, apps) => new { UserApiKeys = keys, UserApiApplications = apps}
                )
                .OrderByDescending(d => (d.UserApiKeys.ExpirationDate ?? DateTime.MaxValue))
                .Select(s => new {
                    ApiKey = s.UserApiKeys.ApiKey, 
                    IsActive = s.UserApiKeys.IsActive, 
                    SystemName = s.UserApiKeys.SystemName,
                    ExpirationDate = (s.UserApiKeys.ExpirationDate == null)
                                                                ? "Newer Expires"
                                                                : s.UserApiKeys.ExpirationDate.ToString(),
                    s.UserApiApplications
                })
                .ToList()

另外,参考@nalka post关于扩展方法的使用:

NotificationEvents
.Where(w => w.ID == 123)
.LeftJoin(
        Events, 
        events => events.EventID, ev => ev.EventID, 
        (events, ev) => new { NotificationEvents = events, Events = ev }
);
    

推荐阅读