Ich habe eine Methode zum Sortieren und Paging von Gridviews, die ich für generische Typen wiederverwendbar machen möchte, aber ich habe Schwierigkeiten herauszufinden, wie die dynamischen Variablen des Entitätskontexts (MyContext) und der Tabelle (tblReports) erstellt werden können. Kann mir bitte jemand helfen?
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();
}
}
Es gelang, es zum Laufen zu bringen, indem die Entitätstabelle als Parameter übergeben wurde, wie von @Jeroen vorgeschlagen, und das Ergebnis der Linq-Abfrage in einen generischen Typ umgewandelt wurde.
Hier ist der endgültige Code für alle Interessierten:
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();
}