#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
-contact2. @MarcGravell он объединяет несколько предложений where. Первый фильтрует пустые контакты, второй будет фильтровать по типу контакта
3. @Wouter да, но проблема (как я прочитал) заключается в том, что он завершается сбоем, когда нет контакта H. Вышеуказанное все равно завершится неудачей, если что-то не будет сделано для окончательного получения
.streetname
4. @MarcGravell Верно, я предполагаю
Contacts
, что это набор ненулевыхContact
объектов5. @Nick как и я; вопрос в том, содержит ли он H-контакт или он не содержит H-контакта?