【问题标题】:Filtering necessary data with LINQ使用 LINQ 过滤必要的数据
【发布时间】:2009-04-16 07:46:34
【问题描述】:

一直在玩 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();

这很好用,但它会返回所有合同,甚至是一些不在“一月”的合同。我错过了一步吗?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您的查询中没有任何内容可以过滤合同 (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};
    

    【讨论】:

      【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        相关资源
        最近更新 更多