Entity Framework 4: Как превратить строку в объект для .OrderBy (p => p.fieldname)? - PullRequest
2 голосов
/ 30 октября 2010

Теперь это вопрос с подвохом, потому что вы не можете сделать это:

var a = myDB.Where(p => p.field == "filter").OrderBy("it." + fieldname);

Вы можете изменить Где принять строку, что позволяет изменить OrderBy для принятиястрока, но это не вопрос.

Как вы можете превратить строку типа "productID, productName" в выражение OrderBy ?Если я не ошибаюсь, может быть, вопрос может заключаться в том, «как превратить шаблон спецификации в делегат Expression?»

Проблема в том, что я не знаю, какую таблицу они хотят, и поэтому я нене знаю первичный ключ.Я использовал обобщения для представления типа таблицы.

public interface IRepository<E, C> where C : ObjectContext  // E is an Entity
{
  void Add(E entity);
  void Del(E entity);
  IList<E> Get(Expression<Func<E, bool>> filterLambda = null,   //Where clause
              Expression<Func<E, object>> orderbyLambda = null, //OrderBy
              int? page = null,                                 //Page to get
              int? pageSize = null,                             //Page Size
              Expression<Func<E, object>> selectLambda = null); //Populate Fields
  int Count(Expression<Func<E, bool>> filterLambda = null);
  bool SaveChanges();
}

Фактическое утверждение, которое я использую для извлечения содержимого из контекста данных (контейнера данных?), Равно

this.GetEntity().Where(filterLambda)
                .OrderBy(orderbyLambda)
                .Skip(((int)page - 1) * (int)pageSize)
                .Take((int)pageSize)
                .Select(selectLambda).ToList();

I необходимо OrderBy() для реализации .Skip() и .Take().Для всех тех, кто думает, что вы можете сделать это правильно для Linq to SQL.Однако Linq to Entities не поддерживает это:

The method 'Skip' is only supported for sorted input in LINQ to Entities.
The method 'OrderBy' must be called before the method 'Skip'.

1 Ответ

3 голосов
/ 30 октября 2010

Вам не нужно строить запрос в одном выражении. Поскольку запрос не выполняется до тех пор, пока вы не введете ToList в конце, вы можете использовать условия для его построения. Пример:

var query = myDB.Where(p => p.field == "filter");

string sort = "productID, productName";

string[] sortItems = sort.Split(new string[] {", "}, StringSplitOptions.None);
switch (sortItems[0]) {
  case "productId": query = query.OrderBy(x => x.ProductId); break;
  case "productName": query = query.OrderBy(x => x.ProductName); break;
}
for (int i = 1; i < sortItems.Length; i++) {
  switch (sortItems[i]) {
    case "productId": query = query.ThenBy(x => x.ProductId); break;
    case "productName": query = query.ThenBy(x => x.ProductName); break;
  }
}
query = query.Skip(10).Take(10);

(Однако тип объекта запроса может измениться при добавлении сортировки (например, от IEnumerable<T> до IOrderedEnumerable<T>), поэтому вам может потребоваться еще несколько переменных для хранения различных этапов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...