2012-05-07 15 views
0
 var query1 = from l in context.Logs 
        where l.LogID == maxid 
        select l; 
     int count1 = query1.Count(); 

     var query2 = from ld in context.LogDetails 
        where ld.LogID == maxid 
        select ld; 
     int count2 = query2.Count(); 

     Assert.AreEqual(1,count1); 
     Assert.AreEqual(0,count2); 

私はより良い方法で上記のクエリを書くことができたらいいと思います。 TSQLを使用していた場合、OUTER JOINとフィルタを使用してld.LogIDがnullであるかどうかを調べることができます。しかし、私はLINQでそれを行う方法を知らない。これをきれいにする方法はありますか?Linq外部結合可能な問題

ありがとうございます。

+0

[方法:左外部結合を実行する(C#プログラミングガイド)](http://msdn.microsoft.com/en-us/library/bb397895.aspx)これはあなたが探しているものですか? – dtb

答えて

3

Outer joins are possible in LINQ

from log in context.Logs 
from logDetail in log.LogDetails.DefaultIfEmpty() 
select new {log, logDetail} 

はnullをlogdetailテストすることを忘れないでください:

var query = from log in context.Logs 
      join logDetail in context.LogDetails 
       on log.LogID = logDetail.LogID into lj 
      from item in lj.DefaultIfEmpty() 
      select new { log.LogID, MissingDetails = lj == null }; 
+0

私はどのようにログテーブルの1レコードとlogDetailsの0レコードだけをチェックするために1行にAssertを書くことができますか?私にお知らせください。 –

0

ここでは、外側のナビゲーションプロパティを使用して参加するのです。

+0

David、LogsとLogDetailsを結合しないでください。 –

+0

David、このクエリはコンパイルされていません。 –

+0

dbmlを開きます。 LogからLogDetailに適切なIDを持つ関連付けを追加します。これで、dbmlはそれぞれのクラスにナビゲーションプロパティを生成します:Log.LogDetailsとLogDetail.Log –

関連する問題