c# - 如何使用 LINQ 左连接多个表

标签 c# asp.net-mvc linq join

我正在尝试使用 LINQ 左连接三个表。我的 SQL 工作如下:

Select j.Id, u.FirstName , u.LastName, u.Role
From    Job j  
    left  join JobTranslator as jt on j.Id = jt.JobId
    left  join JobRevisor as jr on j.Id = jr.JobId
    left  join [User] as u on  jt.UserId = u.Id OR jr.UserId = u.Id
Where   u.Id = someID;

我可以让它与下面的两个连接一起工作:

 IQueryable<Job> jobs =
                from j in _db.Jobs

                join jr in _db.JobRevisors on j.Id equals jr.JobId into jrs
                from jrResult in jrs.DefaultIfEmpty()

                join u in _db.Users on jrResult.UserId equals u.Id into jrU
                from jrUResult in jrU.DefaultIfEmpty()

                where jrUResult.Id == userId
                orderby j.Id
                select j;

但是当我尝试加入我最后需要的表时,它不会像下面那样工作。

IQueryable<Job> jobs =
                from j in _db.Jobs

                join jt in _db.JobTranslators on j.Id equals jt.JobId into jts
                from jtResult in jts.DefaultIfEmpty()

                join jr in _db.JobRevisors on jtResult.Id equals jr.JobId into jrs
                from jrResult in jrs.DefaultIfEmpty()

                join u in _db.Users on jrResult.UserId equals u.Id into jrU
                from jrUResult in jrU.DefaultIfEmpty()

                join u in _db.Users on jtResult.UserId equals u.Id into jtU
                from jtUResult in jtU.DefaultIfEmpty()

                where jtUResult.Id == userId

                orderby j.Id

                select j;

有什么想法吗?

最佳答案

来自 Linq - left join on multiple (OR) conditions :

IQueryable<Job> jobs = (from j in _db.Jobs

                join jt in _db.JobTranslators on j.Id equals jt.JobId into jts
                from jtResult in jts.DefaultIfEmpty()

                join jr in _db.JobRevisors on jtResult.Id equals jr.JobId into jrs
                from jrResult in jrs.DefaultIfEmpty()


                join u in _db.Users on jtResult.UserId equals u.Id into jtU
                from jtUResult in jtU.DefaultIfEmpty()

                where jtUResult.Id == userId

                orderby j.Id

                select j).Concat(
                from j in _db.Jobs

                join jt in _db.JobTranslators on j.Id equals jt.JobId into jts
                from jtResult in jts.DefaultIfEmpty()

                join jr in _db.JobRevisors on jtResult.Id equals jr.JobId into jrs
                from jrResult in jrs.DefaultIfEmpty()

                join u in _db.Users on jrResult.UserId equals u.Id into jrU
                from jrUResult in jrU.DefaultIfEmpty()

                where jtUResult.Id == userId

                orderby j.Id

                select j
                ).Distinct()

关于c# - 如何使用 LINQ 左连接多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885001/

相关文章:

c# - 在 while() 循环中使用 ManualResetEvent()

C# 从事件进程中获取事件 url

c# - 如何从 C# 代码在 Visual Studio 中创建 native DLL?

c# - 如何使用 LINQ 知道周期集合中是否存在任何重叠

c# - LINQ 中的日期格式

c# - 如何正确处理元素?为什么代码分析不断改变主意?

c# - 附加到进程 IIS 未命中断点

javascript - 为什么从字典返回 JsonResult 会改变排序顺序?

asp.net-mvc - 无法从 global.asax 检索 Azure 图形 token

c# - Linq 用于通过比较 2 个属性值从列表 1 中选择存在于列表 2 中的元素