业务层中的 LINQ 分页/用户层中的网格视图排序

Posted

技术标签:

【中文标题】业务层中的 LINQ 分页/用户层中的网格视图排序【英文标题】:LINQ in Business Layer paging / sorting gridview in User layer 【发布时间】:2011-06-11 07:11:55 【问题描述】:

我的用户层中有一个 gridview,它使用业务层方法作为其数据源,我希望 gridview 支持分页和排序。当我从该方法返回一个 Ienumerable 时,它​​将带回所有数据。如果我使用 Take/Skip 只带回一页的价值,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();
        
    

【问题讨论】:

【参考方案1】:

分页问题是由 Using 语句引起的。改变这个:

using (PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext())

...

到这里:

PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext();

使分页工作。现在我必须弄清楚排序是如何工作的。

【讨论】:

鲍勃,这正是我在午餐时告诉你的。很高兴你能弄明白!

以上是关于业务层中的 LINQ 分页/用户层中的网格视图排序的主要内容,如果未能解决你的问题,请参考以下文章

业务/服务层中的 ASP.NET 复杂验证

业务层中的实例方法与静态方法[关闭]

TensorFlow Keras 层中的重新排序轴

如何管理业务逻辑层中的unicity?

视图层中的 DTO 或域模型对象?

如何在 OBIEE 12c 中查看业务模型和映射层中的数据?