2010-10-20 7 views
1

Fondamentalement, je veux écrire une requête linq pour ordonner le nombre de jours où ils étaient présents. Mais j'ai ces six filtres de temps - Aujourd'hui, Hier, mois courant, mois précédent, année courante, année précédente. Maintenant j'ai ces questions que j'ai simplifiées mais avant ces questions ci-dessous, je commande réellement ces employés sur différents aspects et après la commande comme vous pouvez le voir, je cède le rang puis en même temps trouve son nombre (qui peut ou ne peut pas être utilisé pour les classer plus tard) -Comment écrire cette requête linq dynamique?

var result=datacontext.Employee(c=>c.Company.Id==companyId).Select((k, index) => new EmployeeDTO() 
{ 
    EmployeeId=k.Employee.Id, 
    CompanyId=Employee.Company.Id 
    PresentCount=(from e in employeeAttendance 
       where d.RecNum == k.recnum 
       && d.date_present.Year == DateTime.Today.Year 
       && d.date_present.Month == DateTime.Today.Month 
       && d.date_present.Day == DateTime.Today.Day 
       select d).Count() 
} 

alors maintenant, quand le filtre est dire l'année précédente J'ai -

var result=datacontext.Employee(c=>c.Company.Id==companyId).Select((k, index) => new EmployeeDTO() 
{ 
    Position= 
    EmployeeId=k.Employee.Id, 
    CompanyId=Employee.Company.Id 
    PresentCount=(from e in employeeAttendance 
       where d.RecNum == k.recnum 
       && d.date_present.Year == (DateTime.Today.Year-1) 

} 

et si avoir sur le mois je -

var result=datacontext.Employee(c=>c.Company.Id==companyId).Select((k, index) => new EmployeeDTO() 
{ 
    EmployeeId=k.Employee.Id, 
    CompanyId=Employee.Company.Id 
    PresentCount=(from e in employeeAttendance 
       where d.RecNum == k.recnum 
       && d.date_present.Month == DateTime.Today.Month 
       && d.date_present.Year == DateTime.Today.Year 

} 

Je veux fondamentalement combiner tous ces dans une requête avec essentiellement comme une clause dynamique pour découvrir le compte actuel?

Répondre

2

Créez simplement un wrapper simple. Par exemple:

IQueryable<EmployeeDTO> GetEmployeeCount(Expression<Func<DateTime, bool>> pred) 
{ 
    var result=datacontext.Employee(c=>c.Company.Id==companyId). 
    Select((k, index) => new EmployeeDTO() 
    { 
    EmployeeId=k.Employee.Id, 
    CompanyId=Employee.Company.Id, 
    PresentCount=(from e in employeeAttendance 
        where d.RecNum == k.recnum && pred(d.date_present) 
        select d).Count() 
    }); 
    return result; 
} 

Utilisation:

var r = GetEmployeeCount(d => d.Year == (DateTime.Today.Year-1)); 

var r = GetEmployeeCount(
    d => d.Month == DateTime.Today.Month && d.Year == DateTime.Today.Year); 
Questions connexes