2012-01-08 67 views
1

我有一個方法可以獲取我想要在不同線程上使用一些插件(計數,分頁)執行的查詢。更改現有IQueryable的ObjectContext <>

該方法可以得到不同的查詢返回相同的IQueryable<someEntity>

有沒有辦法創建一個EF查詢並設置ObjectContext它?

感謝。

+0

正在爲您使用['ObjectQuery'](http://msdn.microsoft.com/zh-cn/library/bb345303.aspx)「選項嗎? – dasblinkenlight 2012-01-08 13:36:11

+0

也許,我不知道如何創建一個返回ObjectQuery的linq表達式。請詳細說明。 – 2012-01-08 13:42:18

+0

通過'ObjectQuery',您可以使用如下查詢字符串:''SELECT VALUE product FROM AdventureWorksEntities.Products AS product「'。它們在被執行之前一直保持可修改狀態:您可以附加一個'where'子句,跳過/獲取特定的數據片段等等。 – dasblinkenlight 2012-01-08 13:56:03

回答

1

這是不可能的。 IQueryable(和ObjectQuery)依賴於創建它的上下文。作爲解決方法,您可以使用包含查詢的自定義靜態方法,返回IQueryable並接受上下文作爲參數。預編譯的查詢與上下文無關,後面跟着相同的原理。

+0

但我的方法可以得到不同的查詢,返回相同的IQueryable 進行處理。當我執行我的查詢時,我不知道它在查詢什麼。 – 2012-01-08 14:32:39

+0

您的評論沒有意義,或者您沒有正確描述問題。該方法將只包含基本查詢,並且由於它將返回IQueryable,因此您可以在使用它時添加其他條件或分頁。 – 2012-01-08 14:36:25

+0

對不起,更新。希望它更清晰。 – 2012-01-08 14:43:04

0

正如Ladislav Mrnka所說,你可以存儲一個代表來實現這一點。在谷歌搜索之前,我正在做這個工作,以便將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); 
}  

和往常一樣,在創建關閉時要小心。

相關問題