Я понятия не имею, является ли запрос, который вы создали, именно тем запросом, который вам действительно нужен или необходим, но, предположив, что это так, давайте рассмотрим вопрос о том, есть ли лучший способ его написать.
Место, которое вы хотите посмотреть, это раздел 7.16.2.1 спецификации C # 4, часть которой я привожу здесь для вашего удобства:
Выражение запроса с продолжением
from ... into x ...
переведено на
from x in ( from ... ) ...
Это ясно?Давайте посмотрим на фрагмент вашего запроса, который я пометил звездами:
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from studyGroups in
**** (from instance in patientGroups
group instance by instance.StudyID) ****
from seriesGroup in
(from instance in studyGroups
group instance by instance.SeriesID)
from instanceGroup in
(from instance in seriesGroup
group instance by instance.InstanceID)
group instanceGroup by patientGroups.Key;
Здесь у нас есть
from studyGroups in ( from ... ) ...
спецификация говорит, что это эквивалентно
from ... into studyGroups ...
, чтобы мы могли переписать ваш запрос как
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from instance in patientGroups
group instance by instance.StudyID into studyGroups
from seriesGroup in
**** (from instance in studyGroups
group instance by instance.SeriesID) ****
from instanceGroup in
(from instance in seriesGroup
group instance by instance.InstanceID)
group instanceGroup by patientGroups.Key;
Сделайте это снова.Теперь у нас есть
from seriesGroup in (from ... ) ...
, и спецификация говорит, что это то же самое, что и
from ... into seriesGroup ...
, поэтому переписать это так:
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from instance in patientGroups
group instance by instance.StudyID into studyGroups
from instance in studyGroups
group instance by instance.SeriesID into seriesGroup
from instanceGroup in
**** (from instance in seriesGroup
group instance by instance.InstanceID) ****
group instanceGroup by patientGroups.Key;
И снова!
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from instance in patientGroups
group instance by instance.StudyID into studyGroups
from instance in studyGroups
group instance by instance.SeriesID into seriesGroup
from instance in seriesGroup
group instance by instance.InstanceID into instanceGroup
group instanceGroup by patientGroups.Key;
С чем, я надеюсь, вы согласны, намного легче читать.Я бы еще больше улучшил его читабельность, изменив тот факт, что «экземпляр» используется полдюжины раз для обозначения разных вещей:
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from patientGroup in patientGroups
group patientGroup by instance.StudyID into studyGroups
from studyGroup in studyGroups
group studyGroup by studyGroup.SeriesID into seriesGroups
from seriesGroup in seriesGroups
group seriesGroup by seriesGroup.InstanceID into instanceGroup
group instanceGroup by patientGroups.Key;
Является ли этот запрос действительно необходимым для решения вашей проблемы, я неНе знаю, но, по крайней мере, об этом вы можете рассуждать, не выворачивая себя наизнанку, пытаясь выполнить все вложения.
Этот метод называется «продолжение запроса».По сути, идея состоит в том, что продолжение пока вводит новую переменную диапазона в запросе.