2012-01-08 6 views
1

У меня есть метод, который получает запрос, который я хочу выполнить с некоторыми аддонами (счет, пейджинг) для разных потоков.Изменение объекта ObjectContext существующего IQueryable <>

Метод может получить разные запросы, которые возвращают то же самое IQueryable<someEntity>.

Есть ли способ создать запрос EF и установить для него ObjectContext позже?

спасибо.

+0

Использует ['ObjectQuery'] (http://msdn.microsoft.com/en-us/library/bb345303.aspx) вариант для вас? – dasblinkenlight

+0

Возможно, я не уверен, как создать выражение linq, которое вернет ObjectQuery. Пожалуйста, дополните. –

+0

С помощью 'ObjectQuery' вы используете строки запроса следующим образом:' "SELECT VALUE product FROM AdventureWorksEntities.Products AS product". Они остаются модифицируемыми до тех пор, пока они не будут выполнены: вы можете добавить предложение 'where', пропустить/принять, чтобы получить конкретный фрагмент данных и т. Д. – dasblinkenlight

ответ

1

Невозможно. IQueryable (и ObjectQuery) зависит от контекста, который его создал. В качестве обходного пути вы можете использовать собственный статический метод, содержащий ваш запрос, возвращая IQueryable и принимающий контекст как параметр. За одним и тем же принципом следуют предварительно скомпилированные запросы, которые не зависят от контекста.

+0

Но мой метод может получить разные запросы, которые возвращают тот же IQueryable для обработки. когда я выполняю свой запрос, я не знаю, что он запрашивает. –

+0

Либо ваш комментарий не имеет смысла, либо вы неправильно описали проблему. Метод будет содержать только базовый запрос, и поскольку он вернет IQueryable, вы сможете добавлять другие условия или пейджинг при его использовании. –

+0

Извините, обновлено. надеюсь, что это яснее. –

0

Как говорит Ladislav Mrnka, вы можете сохранить делегата, чтобы достичь этого. Я делал это до Googling для способа «пересадить» IQueryable из одного 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); 
}  

И, как обычно, будьте осторожны при создании затворов.

Смежные вопросы