2

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

В случае, если это имеет значение, я использую EF для Oracle и используя 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; 
} 
Смежные вопросы