LINQ: Передача лямбда-выражения как параметр, который будет выполнен и возвращен методом

Таким образом, вот сценарий: у меня есть серия различных классов репозитория, что каждый может использовать изолированный контекст данных или общий контекст. В случаях, где изолированный контекст используется, я хочу добавить метод к базовому классу, который позволит мне определять лямбду как параметр, иметь то выражение быть выполненным изолированным контекстом выбранного репозитория и возвратить результат IQueryable. Как сигнатура метода посмотрела бы, и как к передаче выражение к контексту?

Мне нужно решение быть максимально универсальным, поскольку любой возможный объект модели / таблица мог использоваться.

Вот в основном, что я надеюсь делать:

IAssetRepository repo = new AssetRepository(true); // true indicates isolated context
var results = repo.ExecuteInContext<SomeType>(SomeTable.Where(x => 
                                              x.SomeProp.Equals(SomeValue)));
50
задан Jason Miesionczek 19 August 2009 в 01:14
поделиться

2 ответа

Something like this:

public IEnumerable<T> ExecuteInContext<T>(
  Expression<Func<T,bool>> predicate)
{
  ... // do your stuff
  //eg
  Table<T> t = GetTable<T>();
  return t.Where(predicate);
}

or

public IEnumerable<T> ExecuteInContext<T>(
   IQueryable<T> src, Expression<Func<T,bool>> predicate)
{
  return src.Where(predicate);
}

Usage:

var r = repo.ExecuteInContext<SomeType>( 
          x => x.SomeProp.Equals(Somevalue));

or

var r = repo.ExecuteInContext(GetTable<T>(), 
          x => x.SomeProp.Equals(Somevalue));

Assumptions:

  1. Table can be derived from T, else you will need to pass the source too.
  2. You know how to modify the predicate expression if needed.
66
ответ дан 7 November 2019 в 10:58
поделиться

Check out PredicateBuilder - http://www.albahari.com/nutshell/predicatebuilder.aspx

This code will package up your where clause as Expression objects which you can pass about.

I've implemented the Repository pattern, and my flava is to give it a Fetch(ICriteria) method, which builds up the Where clause depending on the criteria supplied. Simple, but works for me.

6
ответ дан 7 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: