Можем ли мы сделать параллельные запросы EF LINQ? - PullRequest
2 голосов
/ 03 апреля 2012

Я создаю некоторый сервис WCF, который использует EF для запроса к базе данных необходимых мне данных. Проблема, с которой я столкнулся на данный момент, заключается в том, что у меня есть 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 для получения моих данных.

В случае, если это имеет значение, я использую EF в Oracle и использую Code First. У меня нет навигационных свойств и никаких ограничений между таблицами, поэтому я не могу сказать EF загружать меня в «Заказы и адреса» с помощью отложенной загрузки, когда я запрашиваю основную запись о клиенте.

Спасибо заранее, Ник

1 Ответ

0 голосов
/ 23 июля 2013

Вы можете исследовать использование PLINQ. http://msdn.microsoft.com/en-us/library/dd460699.aspx

Также легко использовать библиотеку задач.

, что в вашем случае может выглядеть примерно так:

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;
}
...