Как получить счет от IQueryable
Я реализую подкачку в своем GridView. Из этой статьи мне нужны два метода:
public IQueryable BindEmployees(int startRowIndex, int maximumRows)
{
EmployeeInfoDataContext dbEmp = new EmployeeInfoDataContext();
var query = from emp in dbEmp.Employees
join dept in dbEmp.Departments
on emp.DeptID equals dept.DeptID
select new
{
EmpID = emp.EmpID,
EmpName = emp.EmpName,
Age = emp.Age,
Address = emp.Address,
DeptName = dept.DepartmentName
};
return query.Skip(startRowIndex).Take(maximumRows);
}
и
public int GetEmployeeCount()
{
// How can I not repeat the logic above to get the count?
}
Как я могу получить значение второго метода GetEmployeeCount
из первого метода BindEmployees
? Я имею в виду, не повторяя логику (запрос)?
Ответы
Ответ 1
Один из вариантов:
public IQueryable BindEmployees(int startRowIndex, int maximumRows, out int count)
{
EmployeeInfoDataContext dbEmp = new EmployeeInfoDataContext();
var query = from emp in dbEmp.Employees
join dept in dbEmp.Departments
on emp.DeptID equals dept.DeptID
select new
{
EmpID = emp.EmpID,
EmpName = emp.EmpName,
Age = emp.Age,
Address = emp.Address,
DeptName = dept.DepartmentName
};
count = query.Count();
return query.Skip(startRowIndex).Take(maximumRows);
}
Другой вариант - передать запрос в функцию поискового вызова.
Ответ 2
Сделайте функцию для использования в обоих местах:
//Can be private or public, your choice
private IQueryable<Employee> GetQuery()
{
EmployeeInfoDataContext dbEmp = new EmployeeInfoDataContext();
return from emp in dbEmp.Employees
join dept in dbEmp.Departments
on emp.DeptID equals dept.DeptID
select emp;
}
Затем используйте его в обеих ваших других функциях:
public int GetEmployeeCount()
{
return GetQuery().Count();
}
public IQueryable BindEmployees(int startRowIndex, int maximumRows)
{
var query = from e in GetQuery()
select new { /*Do your anonymous type here*/ };
return query.Skip(startRowIndex).Take(maximumRows);
}
Ответ 3
@Marc Gravell ответ решает проблему, как указано, и, вероятно, это лучший способ. Тем не менее, в интересах предоставления опций вы также можете просто повторить join
(так как вам не нужен анонимный тип при подсчете):
private int GetEmployeeCount(EmployeeInfoDataContext dbEmp)
{
var query = from emp in dbEmp.Employees
join dept in dbEmp.Departments on emp.DeptID equals dept.DeptID
select dept;
return query.Count();
}