Таким образом, вот сценарий: у меня есть серия различных классов репозитория, что каждый может использовать изолированный контекст данных или общий контекст. В случаях, где изолированный контекст используется, я хочу добавить метод к базовому классу, который позволит мне определять лямбду как параметр, иметь то выражение быть выполненным изолированным контекстом выбранного репозитория и возвратить результат IQueryable. Как сигнатура метода посмотрела бы, и как к передаче выражение к контексту?
Мне нужно решение быть максимально универсальным, поскольку любой возможный объект модели / таблица мог использоваться.
Вот в основном, что я надеюсь делать:
IAssetRepository repo = new AssetRepository(true); // true indicates isolated context
var results = repo.ExecuteInContext<SomeType>(SomeTable.Where(x =>
x.SomeProp.Equals(SomeValue)));
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:
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.