2017-10-21 19 views
-1

学校と用語の2つのテーブルがあります。学校記録が表示されなければなりませんが、記録という用語はまだ存在しない可能性があります。そのため、この用語はnullになる可能性があります(したがって、左結合)。左側の結合テーブルは、現在の用語が存在する場合は日付でフィルタリングする必要があります。これはLINQで行うことができますか?LINQへの左結合によるこのSQLの変換

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:

いくつか入力した後、私は左を持って参加したが、学校が、私はまだ開始日と終了日がnullとして表示させることができない期間が欠落している場合 - 学校はまったく表示されません。私が言葉を紛失している場合は、最初の欄に学校を表示します。私は何が欠けているのですか?ここに最新の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(); 

UPDATE#2

SQL結果のスクリーンショットである、と私はLINQで同じことを達成しようとしています:

enter image description here

+0

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

答えて

-1

私は最終的に理解した。結合されたテーブルに.Where()句を置くと、一致するレコードがない場合はnull値が返されます。 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で説明する必要があります。私はUpdate#2で達成しようとしている結果です。私は左の結合を行い、すべての学校の名前を取得することができる必要があります。学校に用語がない場合、nullを返します。これはSQLでうまくいきます。私はLINQでこの結果を複製することができませんでした。ご協力いただきありがとうございます。 –

関連する問題