2011-01-18 35 views
0

我有一個在我的用戶層使用業務層方法作爲其數據源的gridview,我希望gridview支持分頁和排序。當我從方法中返回一個Ienumerable時,它將帶回所有數據。如果我使用Take/Skip來帶回一個頁面的價值,那麼gridview並沒有意識到有很多頁面的數據。LINQ在業務層分頁/排序用戶層gridview

當我將Ienumerable更改爲IQueryable時,DataBind()失敗,因爲數據已被處置。我認爲這個問題與查詢實際執行時有關,它可能與我應用於查詢的過濾器有關(請參見下文)。

用戶層代碼:

grdSelectedQuestionaires.DataSource = assessment.FilteredAssessmentList(filter); 
grdSelectedQuestionaires.DataBind(); <-- Fails - "Cannot access a disposed object" 

業務層郵編:

public IQueryable<Assessment> FilteredAssessmentList(AssessmentSearchFilter filter) 
    { 
     using (PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext()) 
     { 
      var rows = (
        from a in dc.vPAQSummaries 
        select new Assessment() 
        { 
         PAQNumber = a.PAQNumber.Trim(), 
         CustomerID = (int)a.CustomerID, 
         Department = a.Department.Trim(), 
         CustomerName = a.CustomerName.Trim(), 
         DOTNumber = a.DOTNumber.Trim(), 
         OrgName = a.OrgName.Trim(), 
         DateEntered = a.DateEntered, 
         GroupNumber = a.GroupNumber.Trim(), 
         JobTitle = a.JobTitle.Trim(), 
         FileNames = a.FileNames.Trim(), 
         AnalystType = a.AnalystType.ToString(), 
         Incumbents = a.Incumbents, 
        }); 

      // Filter by Customer ID 
      if (filter.CustomerID > 0) 
      { 
       rows = rows.Where(r => r.CustomerID == filter.CustomerID); 
      } 
      else 
      { 
       rows = rows.Where(r => r.CustomerID != null); 
      } 

      // Filter by DOT Number 
      if (!string.IsNullOrEmpty(filter.DOTNumberFrom)) 
      { 
       if (string.IsNullOrEmpty(filter.DOTNumberTo)) 
       { 
        rows = rows.Where(r => r.DOTNumber == filter.DOTNumberFrom); 
       } 
       else 
       { 
        rows = rows.Where(r => r.DOTNumber.CompareTo(filter.DOTNumberFrom) >= 0 
         && r.DOTNumber.CompareTo(filter.DOTNumberTo) <= 0); 
       } 
      } 

      // Filter by OrgName 
      if (!string.IsNullOrEmpty(filter.OrgName)) 
      { 
       rows = rows.Where(r => r.OrgName.StartsWith(filter.OrgName)); 
      } 

      // Filter by Group 
      if (!string.IsNullOrEmpty(filter.GroupNumberFrom)) 
      { 
       if (!string.IsNullOrEmpty(filter.GroupNumberTo)) 
       { 
        rows = rows.Where(r => r.GroupNumber == filter.GroupNumberFrom); 
       } 
       else 
       { 
        rows = rows.Where(r => r.GroupNumber.CompareTo(filter.GroupNumberFrom) >= 0 
         && r.GroupNumber.CompareTo(filter.GroupNumberTo) <= 0); 
       } 
      } 

      if (filter.Skip > 0) 
      { 
       rows = rows.Skip(filter.Skip); 
      } 
      if (filter.Take > 0) 
      { 
       rows = rows.Take(filter.Take); 
      } 
      else 
      { 
       rows = rows.Take(100); 
      } 

      return rows.Distinct(); 
     } 
    } 
} 

回答

0

分頁問題是由使用的語句引起的。更改此:

using (PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext()) 
{ 
... 
} 

這樣:

PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext(); 

分頁製造工作。現在我必須弄清楚排序如何工作。

+0

鮑勃,這正是我在午餐時告訴你的。很高興你能弄明白! – andleer