Если вы посмотрите на подпись .AsParallel()
, она займет IEnumerable<T>
, а не IQueryable<T>
.Запрос linq преобразуется только в оператор SQL, пока он сохраняется как IQueryable.Как только вы перечислите его, он выполнит запрос и вернет записи.
Итак, чтобы разбить ваш запрос:
context.cam.AsParallel()
Этот бит кода, по сути, будет выполнять SELECT * FROM cam
вбазы данных, а затем начать итерацию по результатам. Результаты будут переданы в ParallelQuery .По существу, это приведет к загрузке всей таблицы в память.
.Where(x=> x.cams == "edsfdf")
.Select(item => item.fg)
.FirstOrDefault()
После этого все эти операции будут выполняться параллельно.Простое сравнение равенства строк, вероятно, очень недорогое по сравнению с издержками, связанными с вращением большого количества потоков и управлением блокировками и параллелизмом между ними (о которых PLINQ позаботится за вас).Параллельная обработка и затраты / выгоды - сложная тема, но обычно лучше всего сохранять для работы, интенсивно использующей процессор .
Если вы пропустили вызов AsParallel()
, все останется как IQueryable allпуть через оператор linq, поэтому EntityFramework отправит одну команду SQL, которая выглядит примерно как SELECT fg FROM cam WHERE cams = 'edsfdf'
, и выдаст этот единственный результат, который SQL Server оптимизирует для очень быстрого поиска, особенно если есть индекс для кулачков.