我正在创建一些使用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加载订单和地址。
提前致谢, 尼克
答案 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;
}