2013-09-05 4 views
1

У меня есть метод сортировки сетки и подкачки, который я пытаюсь сделать многоразовым для общих типов, но я изо всех сил пытаюсь понять, как сделать динамические переменные сущности (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(); 
    } 
} 
+0

Что идет не так? Что делает код примера (или нет). –

+0

спасибо за ответ, я в настоящее время должен объявить конкретный контекст объекта (MyContext) и обратиться к определенной таблице сущностей (tblReport) - я хотел бы иметь возможность абстрагировать их вне метода, чтобы он мог стать общим и обрабатывать любое gridview, не привязанное к определенной конфигурации. – Mike

+0

Не можете ли вы передать параметр tblReports в качестве параметра? и используйте 'typeof (tableparameter)' вместо 'typeof (T)'. Делает: «PopulateGridView (grid, db.tableReports);' Ищите базовый класс tblReports в качестве типа параметра. –

ответ

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(); 
} 
Смежные вопросы