Динамическое выражение LINQ для сортировки свойств навигации

MVC3, Entity Framework 4.1 Сначала код.

Работа с 2 таблицами

Модель:

public class UniversityMaster
{
   [Key]
   public string UniversityId { get; set; }
   public string UniversityName { get; set; }

}

public class ProgramMaster
{
    [Key]
    public string ProgramId { get; set; }
    public string ProgramName { get; set; }
    public string UniversityId { get; set; }
    public virtual UniversityMaster University { get; set; } // navigation property

}

Динамическое выражение для сортировки (чтобы избежать оператора switch case):

public virtual IQueryable< ProgramMaster > GetQueryableSort(string sortField="", string sortDirection="")
   {
      IQueryable<ProgramMaster> query = _dbSet;
      ParameterExpression pe = Expression.Parameter(typeof(ProgramMaster), string.Empty);
      MemberExpression property = Expression.PropertyOrField(pe, sortField);
     //get a exception here if the sort field is of navigation property                            (University.UniversityName)
      LambdaExpression lambda = Expression.Lambda(property, pe);
      if (sortDirection == "ASC")
         orderbydir = "OrderBy";
      else
         orderbydir = "OrderByDescending";
         MethodCallExpression call = Expression.Call(typeof(Queryable),
         orderbydir, new Type[] { typeof(TEntity), property.Type }, query.Expression,  Expression.Quote(lambda));

      var returnquery = (IOrderedQueryable<ProgramMaster>)query.Provider.CreateQuery< ProgramMaster >(call);
      return returnquery;
    }

На странице отображается сетка с двумя столбцами Имя программы и Имя университета с использованием веб-сетки. Сортировка работает нормально для столбца Program Name, однако не выполняется при сортировке по названию университета, поскольку это свойство находится в UniversityMaster, а Expression.PropertyOrField выполняет поиск этого свойства в ProgramMaster. Вот исключение:

University.UniversityName 'не является членом типа' App.Core.Model.ProgramMaster

Мой вопрос заключается в том, как я могу сделать это для свойств навигации моего класса модели.

Надеюсь, я смог объяснить сценарий. Любая помощь приветствуется.

6
задан snowp 22 April 2013 в 12:17
поделиться