2

我創建了一些使用EF查詢數據庫以獲取所需數據的WCF服務。我目前遇到的問題是,我有兩個或更多的EF LINQ查詢被聲明,然後執行以恢復我的數據......但這是串行的。一個EF查詢被髮出,然後是下一個。我們可以做並行EF LINQ查詢嗎?

有誰知道並行發出查詢的簡單方法嗎?或者我在尋找異步/並行任務來獲得正確的行爲。

我知道DBContext不是線程安全的,所以如果需要,我在聲明多個上下文時沒有問題。

到目前爲止的代碼如下:

using (IMyContext ctx = MyFactory.GetInstance(request.UserId)) { 

    Response response = new Response(); 

    response.customer = ctx.GetCustomerByAccount(request.data.Account); 
    response.orders = ctx.GetOrdersByAccount(request.data.Account); 
    response.address = ctx.GetDefaultAddressByAccount(request.data.Account); 

    return response; 
} 

的GetCustomerByAccount,GetOrdersByAccount和GetDefaultAddressByAccount代碼只是看起來確實在DbSet一個發現讓我的數據。

萬一它很重要,我在Oracle上使用EF,並使用Code First。我沒有導航屬性,也沒有表格之間的限制,所以當我查詢主客戶記錄時,我無法通過延遲加載告訴EF加載訂單和地址。

由於提前, 尼克

回答

0

你可以調查使用PLINQ的。 http://msdn.microsoft.com/en-us/library/dd460699.aspx

The is also the easy use if Task library.

這可能看起來有點像你的情況下。

using (IMyContext ctx = MyFactory.GetInstance(request.UserId)) { 

Response response = new Response(); 

//response.customer = ctx.GetCustomerByAccount(request.data.Account); 
// you will need to get the return type right, but the example is enough no doubt... 
var taskCust = new Task<Customer>(() => ctx.GetCustomerByAccount(request.data.Account)); 
taskCust.Start(); 

// similar for 
// response.orders = ctx.GetOrdersByAccount(request.data.Account); 
// response.address = ctx.GetDefaultAddressByAccount(request.data.Account); 

Task.WaitAll(taskCust, taskOrders, TaskAddress); 

// fish responses off the tasks and stick in the response structure... See Result property 
response.customer = taskCust.result; 
return response; 
} 
相關問題