1

我有一种用于 gridview 排序和分页的方法,我试图使其可重用于泛型类型,但我正在努力弄清楚如何使实体上下文 (MyContext) 和表 (tblReports) 动态变量 - 有人可以帮帮我吗?

protected void PopulateGridView<T>(GridView grid)
{
    string columnToSortBy = (string)(ViewState["gridview_sortbycolumn"] ?? string.Empty);
    SortDirection sortDirection = (SortDirection)(ViewState["gridview_sortdirection"] ?? SortDirection.Descending);
    int pageIndex = (int)(ViewState["gridview_pageindex"] ?? 0);
    int pageSize = grid.PageCount;

    using (MyContext db = new MyContext())
    {
        if (columnToSortBy != string.Empty)
        {
            var query = db.tblReports.OrderBy(columnToSortBy + " " + sortDirection).Skip(pageIndex * pageSize);
            grid.DataSource = query.ToList();
        }
        else
        {
            string defaultColumn = string.Empty;

            foreach (var field in typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance))
            {
                defaultColumn = field.Name.Remove(field.Name.IndexOf(">")).Replace("<", string.Empty);
                break;
            }

            var query = db.tblReports.OrderBy(defaultColumn).Skip(pageIndex * pageSize);
            grid.DataSource = query.ToList();
        }

        grid.PageIndex = pageIndex;
        grid.DataBind();
    }
}
4

1 回答 1

0

通过将实体表作为@Jeroen 建议的参数传递并将 linq 查询结果转换为泛型类型,设法使其工作。

这是任何有兴趣的人的最终代码:

protected void PopulateGridView<T>(GridView grid, DbSet entityTable)
{
    string columnToSortBy = (string)(ViewState["gridview_sortbycolumn"] ?? string.Empty);
    SortDirection sortDirection = (SortDirection)(ViewState["gridview_sortdirection"] ?? SortDirection.Descending);
    int pageIndex = (int)(ViewState["gridview_pageindex"] ?? 0);

    if (columnToSortBy != string.Empty)
    {
        grid.DataSource = entityTable.OrderBy(columnToSortBy + " " + sortDirection).Cast<T>().ToList();
    }
    else
    {
        // use linq reflection to get the first entity field name to sort by
        string defaultColumn = string.Empty;

        foreach (var field in typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance))
        {
            defaultColumn = field.Name.Remove(field.Name.IndexOf(">")).Replace("<", string.Empty);
            break;
        }

        grid.DataSource = entityTable.OrderBy(defaultColumn).Cast<T>().ToList();
    }

    grid.PageIndex = pageIndex;
    grid.DataBind();
}
于 2013-09-05T13:05:36.257 回答