Linq如何写一个JOIN

时间:2011-03-08 11:57:23

标签: c# linq entity-framework linq-to-entities

Linq to EF,我正在使用asp.net 4,EF 4和C#。

我提出了两种查询数据的方法。方式A和C工作正常。但是B需要实现和附加的WHERE语句(如“c.ModeContent ==”NA“)。

我的问题是:

  • 关于这种联接(外联接,我想)在性能方面最好的方法是什么?
  • 你能告诉我一些代码来实现B中的其他WHERE语句吗?
  • 有什么方法可以改进这段代码吗?

感谢您的时间! : - )

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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版本。