开发者

Linq how to write a JOIN

Linq to EF, I'm using asp.net 4, EF 4 and C#.

Here are two ways I came up with to query my data. Ways A and C are working fine. B however needs to implement and additional WHERE statement (as "where c.ModeContent == 开发者_Python百科"NA").

My question is:

  • Regarding this kind of join (outer join, I suppose) what is the best approach in term of performance?
  • Could you show me some code to implement additional WHERE statement in B?
  • Any way to improve this code?

Thanks for your time! :-)

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


Regarding query B you can apply the condition like this:

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;


Your query will be far more readable and maintainable (and perform at least as well) if you use your association properties instead of join:

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

I'm guessing that the navigation on CmsContent to CmsContentsAssignedToes is called AssignedToes. Change the name in my query if it's actually called something else.

This query can be read out loud and you know exactly what it means. The join versions you have to think about.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜