Я пытаюсь написать репозиторий C # с атомарным контекстом и чувствую, что это идеальная ситуация для использования замыкания, но я не совсем понимаю, как это сделать в C #.У меня есть это как основной метод в моем хранилище:
...
protected virtual IQueryable<T> AsQueryable()
{
return _context.ObjectSet<T>().AsQueryable();
}
...
Между тем, я получил производные классы с методами, такими как:
...
public IQueryable<Arc> ByRun(Run run)
{
IQueryable<Arc> query = from o in AsQueryable()
from r in o.Runs
where r.Id == run.Id
select o;
return query;
}
...
, и я хочу изменить свой метод запроса, чтобы вернуть IEnumerableи быстро распоряжаться контекстом, поэтому вы хотите использовать (что-то вроде) это:
...
protected virtual IEnumerable<T> AsEnumerable()
{
using (IContextUnitOfWork unitOfWork = new EFUnitOfWork())
{
return unitOfWork.ObjectSet<T>().ToList();
}
}
...
Проблема, конечно, заключается в том, что после удаления контекста вызов LINQ для полученного набора IEnumerable завершится неудачно.,Таким образом, я думаю, что я должен связать метод ByRun () и передать его в AsEnumerable () для использования в качестве замыкания.
Хотя я не использовал свой оригинальный стиль языка, я изучил замыкания в Ruby.Там то, что я пытаюсь сделать, выглядело бы примерно так: смешанный псевдокод:
ByRun(Run run)
AsEnumerable do |query|
from o in query
from r in o.Runs
where r.Id == run.Id
select o;
end
end
, где метод AsEnumerable открывает контекст, выполняет переданную операцию и возвращает.Я уверен, что смогу сделать это, как только пойму синтаксис, поэтому я ищу нужные мне методы AsEnumerable и ByRun, реализованные таким образом.