正在寻找一种更好的方法在LINQ中的三个表上执行左外联接

正在寻找一种更好的方法在LINQ中的三个表上执行左外联接,linq,linq-to-sql,Linq,Linq To Sql,我试图在三张桌子上做一个左外连接。我知道有一种方法可以在一个变量中实现这一点,但我还没有弄明白。相反,我执行了两个独立的左外连接,然后在这些连接上执行了左外连接。以下是我的代码: var outerJoin1 = (from h in resultHours join u in results on new {h.PhysicalUnitId, h.MonthNum} equals new {u.PhysicalUnitId, u.MonthNum} into ou

我试图在三张桌子上做一个左外连接。我知道有一种方法可以在一个变量中实现这一点,但我还没有弄明白。相反,我执行了两个独立的左外连接,然后在这些连接上执行了左外连接。以下是我的代码:

var outerJoin1 =    

    (from h in resultHours  
    join u in results on new {h.PhysicalUnitId, h.MonthNum} equals new {u.PhysicalUnitId, u.MonthNum} into outer
    from grouping in outer.DefaultIfEmpty() 
    select new {timeKey = h, Key = grouping});

var outerJoin2 =    

    (from h in resultHours
    join s in serviceHrsResults on new {h.PhysicalUnitId, h.MonthNum} equals new {s.PhysicalUnitId, s.MonthNum} into outer2
    from grouping in outer2.DefaultIfEmpty()
    select new {timeKey = h, Key = grouping});

var outerJoin = 

    (from a in outerJoin1
    join b in outerJoin2 on new {a.timeKey.PlantId, a.timeKey.MonthNum} equals new {b.timeKey.PlantId, b.timeKey.MonthNum} into outer
    from grouping in outer.DefaultIfEmpty()
    select new{timeKey = a, Key = grouping}).Distinct();
我试着把上面的内容放在一个变量中,但我无法让它工作。以下是我尝试过的:

var outerjoin =

    from h in resultHours
    join u in results on new {h.PhysicalUnitId, h.MonthNum} equals new {u.PhysicalUnitId, u.MonthNum} into outer
    from grouping in outer.DefaultIfEmpty()
    from hr in resultHours
    join s in serviceHrsResults on new {hr.PhysicalUnitId, hr.MonthNum} equals new {s.PhysicalUnitId, s.MonthNum} into outer2
    from grouping in outer2.DefaultIfEmpty()
    select new {timeKey = h && timeKey = hr, Key = grouping};
问题在于这两个分组之间存在冲突。我很确定,我只需要在选择之前进行一次分组,但我不知道如何使用“分组入”并包括outer.DefaultIfEmpty()和outer2.DefaultIfEmpty()


如果有人能告诉我,我将不胜感激。

您使用的是重复的范围变量ID-您有2个
分组

-您希望在结果集中使用哪个分组? -这条路线的预期目标是什么?
timeKey=h&&timeKey=hr
-您希望如何在投影中组合这些参数

我会尝试下面的查询,但我已经更改了它的
select
部分,因为您的组合版本对我来说没有意义

让我知道,如果它在所有的工作为您没有数据,这是不容易测试,所以我不能确定新版本是好的

var outerjoin =
    from h in resultHours
    join u in results on new {h.PhysicalUnitId, h.MonthNum} equals new {u.PhysicalUnitId, u.MonthNum} into outer
    from grouping1 in outer.DefaultIfEmpty()
    //from hr in resultHours
    join s in serviceHrsResults on new {grouping1.PhysicalUnitId, grouping1.MonthNum} equals new {s.PhysicalUnitId, s.MonthNum} into outer2
    from grouping2 in outer2.DefaultIfEmpty()
    select new {timeKey = h, Key1 = grouping1, Key2 = grouping2};