2011-03-08 37 views
4

Linq到EF,我使用的是asp.net 4,EF 4和C#。Linq如何寫JOIN

這裏有兩種方法來查詢我的數據。方式A和C工作正常。然而,B需要實現的和額外的WHERE語句(如「where c.ModeContent ==‘NA’)

我的問題是:

  • 對於這種加入的(外連接,我想)什麼在性能方面,最好的方法?
  • 你能告訴我一些代碼來實現額外的WHERE B中陳述?
  • 任何方式來提高這個代碼?

感謝您的時間!:-)

// A    
var queryContents = from c in context.CmsContents 
    where c.ModeContent == "NA" && 
    !(from o in context.CmsContentsAssignedToes select o.ContentId) 
    .Contains(c.ContentId) 
    select c; 

// B - I need to implent where c.ModeContent == "NA" 
var result01 = from c in context.CmsContents 
    join d in context.CmsContentsAssignedToes on c.ContentId equals d.ContentId into g 
    where !g.Any() 
    select c; 

// C 
var result02 = context.CmsContents.Where(x => x.ModeContent == "NA").Where(item1 => context.CmsContentsAssignedToes.All(item2 => item1.ContentId != item2.ContentId)); 
+4

我的眼睛流血的錯別字! –

+0

對不起英語這不是我的第一語言:-) – GibboK

+0

我現在修改了一些我的問題應該有更少的錯別字:-) – GibboK

回答

3

關於查詢B可以申請的條件是這樣的:

var result01 = from c in context.CmsContents where c.ModeContent == "NA" 
join d in context.CmsContentsAssignedToes on c.ContentId equals d.ContentId into g 
where !g.Any() 
select c; 
+0

感謝您的回覆! – GibboK

3

您的查詢就會可讀性和可維護性(和執行至少爲好),如果你use your association properties instead of join

var result = from c in context.CmsContents 
      where c.ModeContent == "NA" 
       && !c.AssignedToes.Any() 
      select c; 

我猜CmsContentCmsContentsAssignedToes的導航叫做AssignedToes。如果它實際上被稱爲別的東西,請在我的查詢中更改該名稱。

這個查詢可以大聲朗讀,你知道究竟是這是什麼意思。您必須考慮的join版本。