【问题标题】:Bind a <List> to an ObjectDataSource (c# and Entity Framework)将 <List> 绑定到 ObjectDataSource(c# 和实体框架)
【发布时间】:2014-01-29 17:40:17
【问题描述】:

我有一个从我的数据库表“Publishers”绑定的 GridView。 “Publishers”表中有 22,000 多行,每个绑定事件都需要 LONG 时间。

我使用以下技术实现了自定义分页:

public class PublisherDataSource
{
    public List<Publisher> GetPublishers(int startIndex, int maxRows)
    {
        using (CA_Entities db = new CA_Entities ())
        {
            return (from publisher in db.Publishers
                    select publisher)
                        .Where(p => p.isActive == true)
                        .OrderByDescending(p => p.CreatedDT)
                        .ThenBy(p => p.SiteURL)
                        .Skip(startIndex)
                        .Take(maxRows).ToList();
        }
    }

    public int GetPublishersCount()
    {
        using (CA_Entities db = new CA_Entities ())
        {
            return db.Publishers.Count();
        }
    }
}

在我的网格控件后面的代码中:

CA_Entities db = new CA_Entities ();

            // Custom paging, to make DB access & page response quicker
            PublisherDataSource pds = new PublisherDataSource();
            ObjectDataSource ods = new ObjectDataSource();
            ods.EnablePaging = true;
            ods.SelectMethod = "GetPublishers";
            ods.SelectCountMethod = "GetPublishersCount";
            ods.TypeName = pds.ToString();
            ods.MaximumRowsParameterName = "maxRows";
            ods.StartRowIndexParameterName = "startIndex";


            gridPublishers.DataSource = ods;

            gridPublishers.DataBind();

这段代码工作得很好,但在我最终绑定网格之前,我想操纵数据库中的结果

例如。删除某些记录,进一步排序和过滤记录。

所以,理想情况下,我想说的是:

 List<Publisher> publishers = new List<Publisher>();
            publishers.DataSource = ods;

            // -data manipulation goes here

            gridPublishers.DataSource = publishers;

            gridPublishers.DataBind();

当然,a 不能是 DataBound,所以...

谁能告诉我如何使用 ObjectDataSource 填充我的发布者列表?

【问题讨论】:

  • 为什么要实现分页,GridView已经支持了。
  • 标准 GridView 分页仍然返回整个 db 表,并在服务器端进行分页计算。检索所有数据的时间太长,所以我只需要返回我们需要查看的数据即可。

标签: c# asp.net entity-framework data-binding objectdatasource


【解决方案1】:

我认为您在获取记录时(在 GetPublishers() 函数中)必须进行数据操作 - 这样您仍然可以使用 ObjectDataSource 作为网格的数据源。

或者,您可以尝试从自定义对象(发布者)填充网格,而不是使用 ObjectDataSource。然后,您必须为 gridview 分页实现功能(gridview_PageIndexChanging(object sender, GridViewPageEventArgs e) 应该完成这项工作)

PageIndexChanging 实现的最简单示例(这实际上是一种技巧,而不是正确的实现)是

protected void GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
  {        
     gv.PageIndex = e.NewPageIndex;
     gv.DataBind();
  }

虽然您正在处理大数据并提到了性能,但我建议您做正确的事情并仅获取您将要显示的行。以下内容可以提供帮助

http://www.aspsnippets.com/Articles/Custom-Paging-in-ASP.Net-GridView-using-SQL-Server-Stored-Procedure.aspx

http://www.4guysfromrolla.com/articles/031506-1.aspx

【讨论】:

  • 可悲的是,我认为你是对的 - 我将不得不这样做 'OldSkool' ;)
【解决方案2】:

您是否尝试过使用Select() 方法?

List<Publisher> publishers = (List<Publisher>)ods.Select();

ObjectDataSource.Select 方法

通过调用方法从底层数据存储中检索数据 由 SelectMethod 属性标识,参数为 SelectParameters 集合。

【讨论】:

  • 感谢 Scheien - SelectMethod (GetPublishers) 被调用,但没有传入参数 [StartIndex] 或 [MaxRows],当 'gridPublishers.DataSource = ods; gridPublishers.DataBind();'被称为所以,发布者列表仍然为空
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多