我在GridView中实现分页。从this文章中,我需要两种方法:
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
的值?我的意思是不重复逻辑(查询)?
答案 0 :(得分:17)
一种选择是:
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);
}
另一个选项是将查询传递给分页功能。
答案 1 :(得分:1)
使功能在两个地方都可以使用:
//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);
}
答案 2 :(得分:0)
@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();
}