2015-07-29 3 views
0

Использование Linq To Entities, как бы воспроизвести следующий SQL-запрос?Несколько левых OUTER OUTER объединяются в LINQ to Entities

SELECT m.MaterialId, m.MaterialName, m.MaterialTitle, vv.NearestTXDate, c.ChannelName 
FROM GB_Material m 
LEFT OUTER JOIN WF_VideoVersion vv on vv.MaterialID = m.MaterialID 
LEFT OUTER JOIN SP_ScheduleEvent se on se.MaterialName = m.MaterialName 
INNER JOIN SP_Schedule s on s.ScheduleID = se.ScheduleID 
INNER JOIN GB_Channel c on c.ChannelID = s.ChannelID 
WHERE LOWER(m.MaterialName) like '%foo%' OR LOWER(m.MaterialTitle) like '%foo%' 

EDIT: Я освобожденный ответ на этот вопрос, как ответ производит точные результаты, что SQL-запрос делает, но имейте в виду, что исходный SQL запрос производит нежелательный Cross Join, который я не понимал, когда я его написал.

ответ

0
(from m in context.GB_Material 
join vv in context.WF_VideoVersion on new {m.MaterialID } 
               equals new { vv.MaterialID } into vv_join 
              from vv in vv_join.DefaultIfEmpty() 
join se in context.SP_ScheduleEvent on new {m.MaterialName } 
               equals new { se.MaterialName } into se_join 
              from se in se_join.DefaultIfEmpty() 
join s in context.SP_Schedule on new {se.ScheduleID } equals new { s.ScheduleID} 
join c in context.GB_Channel on new { s.ChannelID } equals new { c.ChannelID } 

              where 
               m.MaterialName.ToLower().Contains("foo") || m.MaterialTitle.ToLower() .Contains("foo") 

              select new 
              { 
               m.MaterialId, m.MaterialName, m.MaterialTitle, vv.NearestTXDate, c.ChannelName 

              }) 
0

Попробуйте этот запрос

var objlist =(from m in Contex.GB_Material 
from vv in Contex.WF_VideoVersion.Where(x=>x.MaterialID =m.MaterialID).DefaultIfEmpty() 
from se in Contex.SP_ScheduleEvent.Where(x=>x.MaterialName =m.MaterialName).DefaultIfEmpty() 
from s in Contex.SP_Schedule .Where(x=>x.ScheduleID =se.ScheduleID) 
from c in Contex.GB_Channel .Where(x=>x.ChannelID =s.ChannelID) 
WHERE m.MaterialName.ToLower().Contains("foo") || m.MaterialTitle.ToLower() .Contains("foo") 
select new{ m.MaterialId, m.MaterialName, m.MaterialTitle, vv.NearestTXDate, c.ChannelName}).ToList(); 

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

  • Нет связанных вопросов^_^