Теперь это вопрос с подвохом, потому что вы не можете сделать это:
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'.