Running several EntityFramework database queries in parallel
asp.net, asynchronous, c#, multithreading, task-parallel-library
Solution
You will have to change the last part of the code to make it run in parallel:
var taskAccountCode = getAccountCodeAsync(deviceId);
var taskDeviceType = getDeviceTypeAsync(deviceId);
var taskUsername = getUserNameAsync(userId);
await Task.WhenAll(taskAccountCode, taskDeviceType, taskUsername);
var accountCode = taskAccountCode.Result;
var deviceType = taskDeviceType.Result;
var username = taskUsername.Result;
Notice that there is only one `await`. In your original code you `await` every task one after the other making them run in sequence instead of in parallel.
Also, the methods `getAccountCodeAsync` etc. are not really async methods (you should get a compiler warning about this). However, Entity Framework 6 has support for async operations and to use that you should replace `FirstOrDefault` with `FirstOrDefaultAsync`. For each parallel operation you will have to use a separate context, and that is exactly what you are doing.
Problem
I am trying to run three database queries in parallel but I'm not sure that I am doing it correctly. I have made three functions which each make a query to the database. ``` private static async Task<string> getAccountCodeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong) .Select(x => x.AccountCode) .FirstOrDefault(); } } private static async Task<string> getDeviceTypeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong) .Select(x => x.DeviceType) .FirstOrDefault() .DeviceType; } } private static async Task<string> getUserNameAsync(string userId) { int userIdInt; Int32.TryParse(userId, out userIdInt); using (var db = new NetworksEntities()) { return db.Users.Where(x => x.UserId == userIdInt) .Select(x => x.Email) .FirstOrDefault(); } } ``` I then in my code I run the three tasks: ``` var TaskAccountCode = await getAccountCodeAsync(deviceId); var TaskDeviceType = await getDeviceTypeAsync(deviceId); var TaskUsername = await getUserNameAsync(userId); await Task.WhenAll(); // use the results from my three tasks to make a new insert into the db. ``` Is what I am doing actually running my three db queries in parallel? EDIT: ``` private static async Task<string> getAccountCodeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong) .Select(x => x.AccountCode) .FirstOrDefaultAsync(); } } ```