2011-03-08 33 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版本。