2009-04-16 12 views
1

Wurden Spiel mit Linq, aber es ist eine Sache, ich kann es hier tun zu machen scheint .. sind die Situation .. kann sagen, Sie haben ..Filterung notwendige Daten mit LINQ

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

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

Nun, was ich nur erhalten Unternehmen mit Contracts tun möchten, ist eine Liste der Unternehmen bevölkern dann erstellt in .. lets Januar sagen .. so etwas wie dieses ..

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

Dies funktioniert gut, aber es gibt alle Verträge auch einige, die nicht sind im Januar". Vermisse ich einen Schritt?

Antwort

2

Original-Beitrag:

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

Update: mit Erweiterungsmethoden

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

Ich kann nicht glauben, es war so einfach .. ich nur vergessen, die neuen Ergebnisse zuweisen .. – Fredrick

3

Es gibt nichts in der Abfrage, die die Verträge (Company.Contract) filtern würde - nur die Unternehmen selbst . Sie müssten das separat machen, vielleicht über eine Where auf .Contract.

Wenn Sie die Daten von LINQ-to-SQL laden, ist möglicherweise AssociateWith uesful.

Wenn Sie alle Verträge im Bereich unabhängig von Unternehmen wollen, dann vielleicht SelectMany:

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