更改现有IQueryable<>的ObjectContext

时间:2012-01-08 13:25:38

标签: .net entity-framework

我有一个方法可以获取一个查询,我想在不同的线程上使用一些插件(count,paging)执行。

该方法可以获得返回相同IQueryable<someEntity>的不同查询。

有没有办法创建EF查询并稍后将ObjectContext设置为它?

感谢。

2 个答案:

答案 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);
}    

和往常一样,在创建闭包时要小心。