2010-10-20 70 views
1

基本上我想写一个linq查询来订购它们出现的天数。但是我有六个时间过滤器 - 今天,昨天,本月,上个月,本年,上一年。现在,我已经简化了这些查询,但是在下面的这些查询之前,我实际上是在这些员工的不同方面进行订购,并且订购之后,你可以看到我指定等级,然后在同一时间发现了他的计数(可能会或可能不会被用于以后进行排名) -我该如何编写这个动态linq查询?

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

所以,现在当过滤器是说上一年我有 -

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) 

} 

,如果有它当前月我有 -

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 

} 

我基本上想把所有这些在一个查询中结合起来,基本上有一个动态的子句来找出当前的计数?

回答

2

只需创建一个简单的包装。例如:

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; 
} 

用法:

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

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