Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写LINQ左连接_C#_Asp.net_Asp.net Mvc_Linq_Left Join - Fatal编程技术网

C# 如何编写LINQ左连接

C# 如何编写LINQ左连接,c#,asp.net,asp.net-mvc,linq,left-join,C#,Asp.net,Asp.net Mvc,Linq,Left Join,我有这个linq查询,但它只返回ResourceProjectedCapacity表上具有匹配行的资源。如何获取所有资源,如果它们没有匹配的记录,那么容量对象将为null var query = from r in db.Resource join c in db.ResourceProjectedCapacity on r.ID equals c.ResourceID into ps from c in ps.D

我有这个linq查询,但它只返回ResourceProjectedCapacity表上具有匹配行的资源。如何获取所有资源,如果它们没有匹配的记录,那么容量对象将为null

 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
                    };

尝试上面的代码

我认为第二个内部连接会弄乱它上面的左外部连接。我认为解决这个问题的一种方法是将联接分解为一个单独的查询,然后将联接留在该查询上,类似这样:

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
 }
注意:别担心,它不会执行两个db查询,它只会在您使用
.ToList()
或类似的方法对
查询进行评估后对您的db执行。

这个答案对您有帮助吗?
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
                    };