Как получить счет от IQueryable - PullRequest
14 голосов
/ 27 марта 2011

Я реализую пейджинг в моем 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? Я имею в виду, не повторяя логику (запрос)?

Ответы [ 3 ]

17 голосов
/ 27 марта 2011

Один из вариантов:

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 голос
/ 27 марта 2011

Создайте функцию для использования в обоих местах:

//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);
} 
0 голосов
/ 27 марта 2011

@ Ответ Марка Гравелла решает проблему, как указано, и, вероятно, является лучшим способом решения проблемы. Однако в интересах предоставления опций вы также можете просто повторить 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();
}
...