Инструкция Select для предотвращения выбора null

#c# #.net #linq

#c# #.net #linq

Вопрос:

У меня есть модель, в которой Person есть 0, 1 или 2 Contact объекта.
Контактная информация home (contact_type — «h») и контактная информация для работы (contact_type — «w»).

Есть ли способ проверить, что Contact объект с contact_type == "h" существует при выборе названия улицы? Прямо сейчас я получаю исключение null, если объект Contact не существует.

 from m in persons
select new
{
    Id = m.id,
    Name = m.surname,
    Address = m.Contacts.Where(c => c.contact_type == "H").SingleOrDefault().streetname
};
  

Ответ №1:

Как насчет:

 var rows = from m in persons
    let h = m.Contacts.Where(c => c.contact_type == "H").SingleOrDefault()
    select new {
        Id = m.id,
        Name = m.surname,
        Address = (h == null ? null : h.streetname)
    };
  

или:

 var rows = from m in persons
    select new {
        Id = m.id,
        Name = m.surname,
        Address = m.Contacts.Where(c => c.contact_type == "H")
                 .Select(c => c.streetname).SingleOrDefault()
    };
  

который также можно было бы записать (возможно, более четко):

 var rows = from m in persons
    select new {
        Id = m.id,
        Name = m.surname,
        Address = (from c in m.Contacts
                   where c.contact_type == "H"
                   select c.streetname).SingleOrDefault()
    };
  

Комментарии:

1. Мне нравится второй, он кажется мне прямым. Большое спасибо =)

Ответ №2:

У вас может быть Where несколько предложений:

 Address = m.Where( person => person.Contacts != null ).Contacts.Where( ...
  

Комментарии:

1. Это только проверяет, является ли Contacts значение null; он не проверяет, существует ли H -contact

2. @MarcGravell он объединяет несколько предложений where. Первый фильтрует пустые контакты, второй будет фильтровать по типу контакта

3. @Wouter да, но проблема (как я прочитал) заключается в том, что он завершается сбоем, когда нет контакта H. Вышеуказанное все равно завершится неудачей, если что-то не будет сделано для окончательного получения .streetname

4. @MarcGravell Верно, я предполагаю Contacts , что это набор ненулевых Contact объектов

5. @Nick как и я; вопрос в том, содержит ли он H-контакт или он не содержит H-контакта?