2010-10-20 3 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); 
Смежные вопросы