Присоединяется к подзапросам в linq? - PullRequest
1 голос
/ 30 марта 2011

Я использую linq в сочетании с структурой сущностей уже несколько месяцев, и мне интересно узнать о подзапросах и объединениях.

Я часто использую подзапросы, как это:

(from department in
      (from hospital in hospitalRepository.Hospitals
       where hospital.Id == viewModel.DestinationHospitalId
       select hospital.Departments).Single()
 select new { Value = department.Id, Text = department.Name }).ToList();

Я никогда не использовал ключевое слово join, потому что мне кажется, что он слишком сложен. Я думаю, что для объединения мне нужны внешние ключи в моих доменных объектах, которые мне не очень нравятся, и я чувствую, что подзапросы более интуитивно понятны. Тем не менее, я почти всегда вижу, как люди используют объединения в linq, что заставляет меня задуматься о том, намного ли лучше объединения или что люди просто привыкли использовать объединения из SQL.

Кроме того, я столкнулся с проблемой, связанной с моими подзапросами, которая заключается в том, что когда Hospitals ObjectSet не содержит больницы с идентификатором, который я хочу. Я не знаю, как заставить подзапрос возвращать пустую коллекцию. Видимо, по умолчанию для списка null. Теперь я использую Single и ловлю исключение, однако я бы предпочел, чтобы мой запрос просто возвращал пустой список.

Должен ли я просто начать использовать соединения? Разве я не хочу, чтобы мой запрос возвращал пустой список и обрабатывал этот случай как исключение? Было бы лучше, если бы по умолчанию список был пустым?

Некоторая предыстория. Цель этого запроса - заполнить раскрывающийся список в моем представлении на основе выбранного значения другого раскрывающегося списка. У другого выпадающего списка не может быть выбора, из-за которого первый выпадающий список должен быть пустым. Так что это не на самом деле исключение.

Заранее спасибо.

1 Ответ

3 голосов
/ 30 марта 2011

Я бы определенно начал бы принимать соединения на вашем месте. По сути, если у вас есть две коллекции и вы хотите найти соответствующие строки на основе некоторого идентификатора, то это именно то, для чего нужно объединение. Не думайте об этом с точки зрения баз данных - думайте об этом с точки зрения соответствия.

Я не совсем уверен, что вам это нужно в этом случае, заметьте ... Я подозреваю, что с вами все будет в порядке:

from hospital in hospitalRepository.Hospitals
where hospital.Id == viewModel.DestinationHospitalId
from department in hospital.Departments
select new { Value = department.Id, Text = department.Name }

Здесь, если нет подходящих результатов, вы получите с пустым списком, что решает проблему для вас. Однако вам также следует знать о некоторых альтернативах Single для других ситуаций:

  • First
  • FirstOrDefault
  • SingleOrDefault
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...