【问题标题】:How to write LINQ left join如何编写 LINQ 左连接
【发布时间】:2014-07-29 22:24:09
【问题描述】:
 var query = from r in db.Resource
                    join c in db.ResourceProjectedCapacity on r.ID equals c.ResourceID into ps
                    from c in ps.DefaultIfEmpty(null)
                    join p in db.Project on c.ProjectID equals p.ID
                    select new
                    {
                        Capacity = c,
                        Resource = r,
                        Project = p
                    };

我有这个 linq 查询,但它只返回在 ResourceProjectedCapacity 表上具有匹配行的资源。如何获取所有资源,如果它们没有匹配的记录,Capacity 对象为空?

【问题讨论】:

标签: c# asp.net asp.net-mvc linq left-join


【解决方案1】:
from i in db.Resource
let c = db.ResourceProjectedCapacity.Where(cc => i.id == cc.ResourceID).FirstOrDefault()
let p = db.Project.Where(pp => c.ProjectID == pp.ID).FirstOrDefault() 
select new
{
  Capacity = C,
 Resource = i,
 Project = p
 }

试试上面的代码

【讨论】:

    【解决方案2】:

    我认为辅助内连接会弄乱它上面的左外连接。我认为解决它的一种方法是将联接分解为一个单独的查询,然后在其上留下联接,如下所示:

    var subquery = from c in db.ResourceProjectedCapacity
                   join p in db.Project on c.ProjectID equals p.ID
                   select new { c, p };
    
    
    var query = from r in db.Resource
                        join c in subquery on r.ID equals c.c.ResourceID into ps
                        from c in ps.DefaultIfEmpty(null)
                        select new
                        {
                            Capacity = c.c,
                            Resource = r,
                            Project = c.p
                        };
    

    NB 别担心,它不会执行两个数据库查询,它只会在您使用 .ToList() 或类似的东西评估 query 后对您的数据库执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2013-12-29
      相关资源
      最近更新 更多