我有一个方法可以获取一个查询,我想在不同的线程上使用一些插件(count,paging)执行。
该方法可以获得返回相同IQueryable<someEntity>
的不同查询。
有没有办法创建EF查询并稍后将ObjectContext设置为它?
感谢。
答案 0 :(得分:1)
这是不可能的。 IQueryable(和ObjectQuery)依赖于创建它的上下文。作为一种解决方法,您可以使用包含查询的自定义静态方法,返回IQueryable并接受上下文作为参数。相同的原则之后是预编译的查询,这些查询与上下文无关。
答案 1 :(得分:0)
正如Ladislav Mrnka所说,你可以存储一名代表来实现这一目标。我之前在Googling中这样做是为了将IQueryable从一个DbContext“移植”到另一个DbContext。我很高兴看到我的方法得到验证:)
这是一个具体的例子:
// keep your delegate somewhere
private Func<MyDbContext, IQueryable<MyEntity>> _queryFactory;
// create the query
_queryFactory = db => db.MyEntities.Where(x => x.Something == "ABC");
// when you want to "attach" the query:
var query = _queryFactory(new MyDbContext());
var result = query.ToList();
// you can also conditionally build on the query
if(something)
{
var closure = _queryFactory; // StackOverflow without this
_queryFactory = db =>
closure(db).Where(x => x.SomethingElse > 123);
}
和往常一样,在创建闭包时要小心。