2012-05-07 5 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 пустым. Но я не знаю, как это сделать в LINQ. Есть ли способ очистить это?Linq внешнее соединение возможный выпуск

Спасибо за помощь.

+0

[Практическое руководство. Выполнение левых внешних соединений (руководство по программированию на C#)] (http://msdn.microsoft.com/en-us/library/bb397895.aspx) Это то, что вы ищете? – dtb

ответ

3

Outer joins are possible in LINQ.

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

, так как я могу написать Assert в одной строке, чтобы проверить только 1 запись в таблице журналов и 0 запись в logDetails? Пожалуйста, дайте мне знать. –

0

Вот внешнее соединение, используя навигационные свойства:

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

Не забудьте проверить logdetail для нуля.

+0

Дэвид, не следует ли подключаться к журналам и LogDetails каким-то образом? –

+0

Дэвид, этот запрос не компилируется. –

+0

Откройте dbml. Добавьте ассоциацию из журнала в LogDetail с соответствующими идентификаторами. Теперь dbml создаст свойство навигации для каждого из этих классов: Log.LogDetails и LogDetail.Log –

Смежные вопросы