Я имею 1 многим отношения со следующими таблицами - Человек и электронная почта. При использовании linq к sql и ASP.NET MVC, я хотел бы показать первую электронную почту или пустую строку в моем представлении Person с помощью кода как это:
<%= Html.Encode(Model.Emails.FirstOrDefault().EmailAddress) %>
В случаях, где нет никаких почтовых строк, я получаю NullReferenceException. Я могу возвратить пустые безопасные значения от SQL при помощи представления или sproc, но я хотел бы просто придерживаться универсального linq к объектам sql, связанным с таблицами.
Model.Emails.Select(x => x.EmailAddress).FirstOrDefault() ?? string.Empty
<%= Html.Encode((Model.Emails.FirstOrDefault() ?? new Email { EmailAddress = string.Empty }).EmailAddress) %>
Будет работать, но не очень чисто для чтения.
Мой голос за:
Model.Emails.Select(z => z.EmailAddress).DefaultIfEmpty("zzz").FirstOrDefault();
Я думал, что все это можно сделать внутри FirstOrDefault, но я ошибался! Однако я также забыл, что когда вы используете DefaultIfEmpty, вы можете просто вызвать First().
Model.Emails.Select(z => z.EmailAddress).DefaultIfEmpty("zzz").First();
Конечно, замените ZZZ на просто "" (не string.empty, это лишнее), но приятно видеть те записи, где выбор по умолчанию происходит явно при первом написании.