我们可以做并行EF LINQ查询吗?

时间:2012-04-03 18:04:17

标签: linq entity-framework ef-code-first parallel-processing code-first

我正在创建一些使用EF来查询数据库以获取所需数据的WCF服务。我现在遇到的问题是我有2个或更多的EF LINQ查询被声明然后被执行以带回我的数据......但这是串行的。发出一个EF查询,然后发出下一个查询。

有谁知道并行发出查询的简单方法?或者我正在查看异步/并行任务以获得正确的行为。

我知道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加载订单和地址。

提前致谢, 尼克

1 个答案:

答案 0 :(得分: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;
}