Как использовать LINQ, где выражение? - PullRequest
0 голосов
/ 29 ноября 2011

Я внедряю шаблон службы \ репозитория в новом проекте. У меня есть базовый интерфейс, который выглядит следующим образом. Все отлично работает, пока мне не нужно использовать метод GetMany. Я просто не уверен, как передать выражение LINQ в метод GetMany. Например, как бы я просто отсортировал список объектов типа name?

nameRepository.GetMany (?)

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(Expression<Func<T, bool>> where);
    T GetById(long Id);
    T GetById(string Id);
    T Get(Expression<Func<T, bool>> where);
    IEnumerable<T> GetAll();
    IEnumerable<T> GetMany(Expression<Func<T, bool>> where);

}



 public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where)
 {
    return dbset.Where(where).ToList();
 }

1 Ответ

2 голосов
/ 29 ноября 2011

Предполагая, что у вас есть реализация IRepository<MyClass>, вы должны вызвать GetMany следующим образом:

IRepository<MyClass> repository = ...;

IEnumerable<MyClass> filtered = repository.GetMany(
    mc => true);

Обратите внимание на mc => true лямбда-выражение .mc в этом случае - параметр (в данном случае, типа MyClass), переданный в Expression<Func<T, bool>>, который будет оцениваться (можно было бы предположить через IQueryable<T>) и mc.SomeProperty == someValue - это выражение, которое возвращает true, который является вторым параметром типа Expression<Func<T, bool>>.

Получив filtered, вы можете использовать предложение order by(или OrderBy метод расширения , они одинаковы) для сортировки результатов, например так:

var filteredAndOrdered = filtered.OrderBy(mc => mc.MyProperty);

Обратите внимание, что GetMany возвращает IEnumerable<T>, не и IQueryable<T>;это важно, если ваш результирующий набор большой, так как упорядочение произойдет на клиенте, а не будет отправлено на сервер.

Для операции OrderBy это может быть дорого, потому что оно должно пройтився последовательность (на заказ) перед возвратом первого результата.

...