繁体   English   中英

绑定一个 <List> 到ObjectDataSource(c#和实体框架)

[英]Bind a <List> to an ObjectDataSource (c# and Entity Framework)

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

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

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

这段代码非常出色,但在我最终绑定网格之前,我想操纵db的结果

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

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

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

            // -data manipulation goes here

            gridPublishers.DataSource = publishers;

            gridPublishers.DataBind();

但当然,一个不能是DataBound,所以......

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

我认为在获取记录时(GetPublishers()函数内部)你将不得不进行数据操作 - 这样你仍然可以使用ObjectDataSource作为网格的数据源。

或者,您可以尝试从自定义对象(发布者)填充网格,而不是使用ObjectDataSource。 然后,您必须为gridview分页实现函数/(gridview_PageIndexChanging(对象发送者,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

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

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

ObjectDataSource.Select方法

通过使用SelectParameters集合中的参数调用SelectMethod属性标识的方法,从基础数据存储中检索数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM