2011-09-08 194 views
1
var companytoexclude = from c in db.Companies 
        from p in c.Projects 
        where p.ProjectEndDate == null 
        select c; 

var list = from m in db.Members.Include("Companies.Projects.Experiences") 
        where m.MemberId == id 
        select m; 

我该如何排除公司在公司排除在列表中?linq比较2列表

会员有很多公司
公司有很多项目
项目有很多经验



K I样解决它。 因此,我所做的只是添加在

foreach (Company c in companytoexclude) 
      { 
       list .First().Companies.Remove(c); 
      } 

所以有一个更容易显示这个? 我想要公司名单的成员,而不仅仅是公司。

一些数据

Member 
MemberId Name 
2011  Jet 

Company 
CompanyId MemberId CompanyName 
18   2011   Company1 
29   2011   Company2 

ProjectId CompanyId ProjectName ProjectEndDate 
1   29   Project1 2008-08-01 00:00:00.000 
2   29   Project2 2009-08-01 00:00:00.000 
3   18   Project3  NULL 

现在我想它返回的一切,但公司1和项目3

回答

2

如何:

var list = from m in db.Members.Include("Companies.Projects.Experiences") 
      where m.MemberId == id 
      where !m.Companies.Intersect(companiesToExclude).Any() 
      select m; 

这只会返回成员不包括任何您试图排除的公司。

请注意,鉴于您指定了MemberId,我几乎只会期待一个结果......不清楚您要做什么。

如果你想从单件除了公司排除所有的企业,很容易:

var member = db.Members.Include("Companies.Projects.Experiences") 
       .Single(m => m.MemberId == id); 
var companies = member.Companies.Except(companiesToExclude); 

如果不是你以后,请澄清你的问题。

另请注意,您的companiesToExclude查询可能不正确的开始。您是否尝试排除任何项目的所有公司并且结束日期为空?如果是这样,你想:

var companiesToExclude = db.Companies 
          .Where(c => c.Projects 
             .Any(p => p.ProjectEndDate == null)) 
+0

其中m.Companies.Intersect(companiesToExclude)。任何()的回头率什么 – Prez

+0

@Prez:好吧,那么也许你所有的成员都被排除公司...如果你能给出一些失败的样本数据,这将有所帮助。 –