2009-04-16 87 views
1

必要的数据已经被玩弄LINQ,但有一件事我似乎无法让它做..这里的情况..可以说你有..过滤与LINQ

public class Job 
{ 
    public DateTime? CreatedDate { get; set; } 
} 

public class Company 
{ 
    public string Name { get; set; } 
    public List<Job> Contract { get; set; } 
} 

现在我想要做的就是填充公司的名单则只能获得公司在创建合同..让说一月..这样的事情..

String[] MonthName = { "January", "February", "March", "April", "May", "June", "July", "Agust", "September", "October", "November", "December" }; 

List<Company> Companies = PopulateData(); 
List<Company> ValidCompany = Companies.Where(CompanyFilter => CompanyFilter.Contract.Any(ContractFilter => MonthName[ContractFilter.CreatedDate.Value.Month - 1] == "January")).ToList(); 

这工作得很好,但它甚至返回所有合同有些不在一月”。我错过了一步吗?

回答

2

原帖:

List<Company> ValidCompany = (
    from c in Companies 
    let janContracts = c.Contracts 
     .Where(con => MonthName[con.CreatedDate.Value.Month - 1] == "January") 
    where janContracts.Any() 
    select new Company 
    { 
     Name = c.Name, 
     Contracts = janContracts.ToList() 
    }).ToList(); 

更新:与扩展方法

var janCompanies = Companies.Select(c=> 
    new Company 
    { 
     Name = c.Name, 
     Contracts = c.Contracts 
      .Where(con => MonthName[con.CreatedDate.Value.Month - 1] == "January") 
      .ToList() 
    }); 
List<Company> ValidCompany = janCompanies 
    .Where(c=>c.Contracts.Any()) 
    .ToList(); 
+0

我不能相信这是这么简单..我只是忘了分配新的结果.. – Fredrick 2009-04-16 07:56:18

3

有没有在你的查询,将过滤合同(Company.Contract) - 只有企业自己。您需要单独执行此操作,可能需要.Contract上的Where

如果您正在从LINQ-to-SQL加载数据,则AssociateWith可能会很好用。

如果你想在范围内的所有合同,无论公司的,那么也许SelectMany

var qry = from company in Companies 
      from contract in company.Companies 
      where contract.CreatedDate.Value.Month == ... etc 
      select new {Company = company, Contract = contract};