簡體   English   中英

LINQ中的多個Left OUTER OUTER連接到實體

[英]Multiple Left OUTER OUTER joins in LINQ to Entities

使用Linq To Entities如何重現以下SQL查詢?

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%'  

編輯:我已經排除了對此問題的答案,因為答案會產生此SQL查詢所做的確切結果,但是請注意,原始SQL查詢會產生不必要的交叉聯接,當我編寫它時我沒有意識到。

(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

                                             })

試試這個查詢

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM