在不同的DbContext实例上重新执行IQueryable? [英] Reexecuting IQueryable on different DbContext instance?
问题描述
我正在创建一个封装 DbContext
的存储库层。
我想公开一个流畅的界面来构建查询,并且在发送查询请求后每次处理并创建一个新的 DbContext
:
I'm creating a repository layer to encapsulate DbContext
.
I would like to expose a fluent interface for building query, and dispose and create a new DbContext
every time after a query request is sent:
var repo = new EntityRepository();
repo = EntityRepository.FilterByAge(30).FilterByGender("Male");
var people = repo.GetPeople();
// GetPeople() should send the request, get the result, then dispose
// the old DbContext and create a new one
repo = repo.FilterByOccupation("Programmer");
var programmers = repo.GetPeople();
// the age and gender filters should still apply here
目前在我的 EntityRepository
,我有一个私人的 DbContext
和一个 IQueryable
。在Filter方法中,我将Linq方法附加到 IQueryable
上。然后在完成请求后,我做:
Currently in my EntityRepository
, I have a private DbContext
and a IQueryable
. In the Filter methods, I append the Linq methods onto the IQueryable
. Then after finishing a request, I do:
db.Dispose();
db = new EntityContext();
但是,当我尝试执行其他请求时,这不行。它表示 DbContext
已被处理。
But this does not work when I try to do another request. It says the DbContext
has been disposed.
如何保持相同的查询新的$ $ $ c> DbContext ?
How do I keep the same query for a new DbContext
?
推荐答案
我最后保留了一个过滤器列表,这是匿名的 IQueryable
并返回 IQueryable
的函数。然后我将它们应用于短暂的 DbContext
:
I ended up keeping a list of "filters", which are anonymous functions that takes in IQueryable
and return IQueryable
. Then I apply them on a short-live DbContext
:
存储库: p>
Repository:
private IList<Func<IQueryable<Person>, IQueryable<Person>>> filters;
public Repository FilterByAge(int age)
{
var _filters = new List<Func<IQueryable<Person>, IQueryable<Person>>>(filters);
_filters.Add(q => q.Where(e => e.Age == age));
return new Repository(_filters);
}
public Repository OrderByName()
{
var _filters = new List<Func<IQueryable<Entity>, IQueryable<Entity>>>(filters);
_filters.Add(q => q.OrderBy(e => e.Name));
return new Repository(_filters);
}
private IQueryable<Person> ApplyFilters(AppContext db)
{
var result = db.People;
foreach (var filter in filters)
{
result = filter(result);
}
return result;
}
public IEnumerable<Person> GetPeople()
{
IEnumerable<Person> people;
using (var db = new AppContext())
{
people = ApplyFilters(db).ToList();
}
return people;
}
使用
private Repository repo = new Repository();
var peopleOfThirty = repo.FilterByAge(30);
var orderedByName = peopleOfThirty.OrderByName();
if (wantOrder)
{
return peopleOfThirty.GetPeople();
}
else
{
return orderedByName.GetPeople();
}
它适用于我的目的。但是,如果这样做有问题请通知我。谢谢!
It works for my purposes. However, please let me know if there is any problem doing it this way. Thanks!
这篇关于在不同的DbContext实例上重新执行IQueryable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!