2017-10-21 102 views
-1

有兩個表格,學校和學期。學校記錄必須顯示,但記錄的詞語可能尚不存在,因此,該詞可能爲空(即左連接)。如果存在,則必須按照當前術語的日期過濾左連接表。這可以在LINQ中完成嗎?將此SQL與左連接轉換爲LINQ

select school.school_name, term.term_start, term.term_end 
from school 
left join term on school.school_id = term.school_id and term.term_start <= '2017-10-21' and term.term_end >= '2017-10-21' 
where school.active = 1 
order by school.school_name 

UPDATE:

一些輸入後,我有一個左連接,但如果一所學校缺少一個學期,我仍然不能使開始和結束日期顯示爲空 - 學校不顯示在所有如果我錯過了一個學期,我想讓學校在第一欄中展示。我在想什麼?這是最新的LinqPad代碼。

var query = ((from sc in Schools.Where(s => s.Active == 1) 
      join t in Terms on sc.School_id equals t.School_id into ts 
      from tsub in ts.DefaultIfEmpty() 
      select new {name = sc.School_name, 
         start = tsub.Term_start, 
         end = tsub.Term_end}) 
      .Where (o => o.start <= DateTime.Now && o.end >= DateTime.Now)) 
      .OrderBy(o => o.name); 

query.Dump(); 

更新#2

下面是SQL結果的屏幕截圖,我想實現在LINQ同樣的事情:

enter image description here

+0

https://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9#leftouterjoin –

回答

-1

我終於弄清楚了。如果將.Where()子句放在連接的表上,如果沒有匹配的記錄,您將獲得空值。這是LinqPad LINQ語句,它可以在.NET MVC中完美運行。

var query = ((from sc in Schools.Where(s => s.Active == 1) 
      join t in Terms.Where(x => x.Term_start <= DateTime.Now && x.Term_end >= DateTime.Now) on sc.School_id equals t.School_id into ts 
      from tsub in ts.DefaultIfEmpty() 
      select new {name = sc.School_name, 
         start = tsub.Term_start, 
         end = tsub.Term_end}) 
      .OrderBy(o => o.name)); 

query.Dump(); 
0
var query = from sc in school.Where(s = > s.active == 1) 
      join t in term on sc.school_id == t.school_id 
      select new {name = sc.school_name, 
         start = t.term_start, 
         end = term.term_end} 
      .Where (o => o.start <= '2017-10-21' && o.end >= '2017-10-21') 
      .OrderBy(o => o.school_name) 
+0

barakcaf,我認爲這是一個正確的答案,但研究它過去一小時後,我意識到,如果一個學校沒有學期,「開始」和「結束」的空值沒有出現在這些欄中。我將發佈顯示左連接的LinqPad代碼,但它仍不起作用。欣賞輸入但尚未完成。 –

+0

這是對您的原始問題的回答(您的linqPad代碼幾乎與此相同),如果您有其他要求,您應該打開一個新問題或更詳細地解釋您需要執行的操作 – barakcaf

+0

barakcaf,我添加了屏幕快照我試圖在更新#2中實現的結果。我需要能夠做一個左連接並檢索所有的學校名稱,如果學校沒有學期,那麼它會返回一個null,它在SQL中很好地執行。我一直無法在LINQ中複製這個結果。感謝您的幫助。 –