2012-03-26 163 views
0

這是我的LINQ查詢Linq查詢與LEFT JOIN有多個表

from row in (
    from c in db.TabC 
    from cpd in db.TabPD 
    from slm in db.TabSLM 
    where cpd.SLid == slm.SLid 
    where c.Id == cpd.CID 
    where c.O_Id == 1 
    select new { c, cpd, slm }) 
group row in row.slm.SLType into g 
select new 
{ 
    SLType = g.Key, 
    EStat = g.Count(r => r.c.EstatID != null), 
    Training = g.Count(r => r.cpd.TrId != null), 
    TrainingComplete = 
     g.Count(r => r.cpd.TrStat == 44), 
    AssessmentComplete = 
     g.Count(r => r.cpd.CndAssess == 44) 
}; 

我需要一個左連接表db.TabSLM並且有在該表中獲得儘可能多的記錄。 TabC是一個主表,TabSLM也是。 TabPD具有引用TabC和TabSLM的詳細記錄。使用此查詢,當TabPD中沒有匹配的TabC rowid或TabSLM rowid時,我不會返回任何記錄。我想要的是返回TabSLM中存在的記錄數,因爲沒有匹配。有關如何修改此查詢的任何想法?

這裏是下面是每個最小領域的三個表的樣本數據中列出

TabC 
ID O_ID Name 
1  1  ABC 
2  1  XYZ 
3  1  RST 

TabPD 
RowID CID SLid 
1  2  1 
2  1  1 
3  3  2 
4  ... 

TabSLM 
SLid SLType 
1  single level 
2  Multi level 

與查詢以上,我能夠得到記錄,其中TabC.O_ID == 1,但不是哪裏TabC.O_ID == 3,因爲TabC.O_ID沒有我還是想與其他列顯示爲0

感謝您的時間,以顯示與SLType ID == 3.任何記錄......

回答

2

您需要使用DefaultIfEmpty

var query = 
    from row in (
     from c in db.TabC 
     join cpd in db.TabPD on c.Id equals cpd.CID 
     from slm in db.TabSLM.Where(x => cpd.SLid == x.SLid) 
          .DefaultIfEmpty() 
     where c.O_Id == 1 
     select new { c, cpd, slm }) 
group row by row.slm.SLType into g 
select new 
{ 
    SLType = g.Key, 
    EStat = g.Count(r => r.c.EstatID != null), 
    Training = g.Count(r => r.cpd.TrId != null), 
    TrainingComplete = 
     g.Count(r => r.cpd.TrStat == 44), 
    AssessmentComplete = 
     g.Count(r => r.cpd.CndAssess == 44) 
}; 
+0

沒有工作。我在這裏仍然沒有記錄。 – user20358 2012-03-26 16:37:48

+0

此外,「將row.slm.SLType中的行組合到g中」不起作用。 「將row.slm.SLType分組到g」中。 – user20358 2012-03-26 16:54:22

+0

@ user20358 - 我稍微更新了查詢。沒有看到表* TabC *,* TabPD *,* TabSLM *我將無法知道預期的結果 – Aducci 2012-03-26 16:55:37

0

剛剛嘗試這一次,

var query = 
    from row in (
     from c in db.TabC 
     join cpd in db.TabPD on c.Id equals cpd.CID into temp 
          from cpd in temp.DefaultIfEmpty() 
     from slm in db.TabSLM.Where(x => cpd.SLid == x.SLid) 
          .DefaultIfEmpty() 
     where c.O_Id == 1 
     select new { c, cpd, slm }) 
group row by row.slm.SLType into g 
select new 
{ 
    SLType = g.Key, 
    EStat = g.Count(r => r.c.EstatID != null), 
    Training = g.Count(r => r.cpd.TrId != null), 
    TrainingComplete = 
     g.Count(r => r.cpd.TrStat == 44), 
    AssessmentComplete = 
     g.Count(r => r.cpd.CndAssess == 44) 
};