web-dev-qa-db-ja.com

IQueryableからカウントを取得する方法

GridViewにページングを実装しています。 this の記事から、2つの方法が必要です。

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から2番目のメソッドBindEmployeesの値を取得するにはどうすればよいですか?ロジック(クエリ)を繰り返さないということですか?

17
Homam

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

もう1つのオプションは、クエリを渡すことですintoページング関数。

19
Marc Gravell

両方の場所で使用する関数を作成します。

//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);
} 
1
jonathanpeppers

@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();
}
0
Bryan Watts