Linq Firstordefault проверяет значение по умолчанию
как я могу проверить, действительно ли объект, возвращенный функцией linq FirstorDefault, по умолчанию?
Например
Contact contact = dbo.contact
.where(m=>m.contactName == "Stackoverflow")
.FirstOrDefault()
существует ли альтернативный способ проверки того, является ли контакт выше значением по умолчанию, а не используется:
if(!contact.contactName.equal("Stackoverflow"))
do something
Ответы
Ответ 1
Вам не нужно будет выполнять проверку равенства, потому что ваш запрос возвращает объекты, в которых имя contantName Stackoverflow
. Когда вы используете FirstOrDefault
, он возвращает null
, если объекты не найдены, поэтому вы можете сделать
if(contact == null)
do something
Вы знаете, что это ссылочный тип, если Contact является классом, поэтому значение по умолчанию будет равно null. Однако вы можете проверить тип по умолчанию любого объекта (ссылку или значение) с помощью default
.
if(contact == default(Contact))
do something
Как уже упоминалось в комментариях, вы можете сделать свой код более эффективным, используя перегрузку FirstOrDefault
, которая берет предикат.
FirstOrDefault(m => m.contactName == "Stackoverflow")
Вы также можете изменить значение по умолчанию, возвращаемое, если ваша программа должна работать с чем-то другим, кроме null
или 0
. Например
Contact defaultContact = new Contact();
defaultContact.ContactName = "StackExchange";
Contact contact = dbo.contact.Where(m=>m.contactName == "Stackoverflow")
.DefaultIfEmpty(defaultContact).First();
Вышеуказанный объект возвращает объект defaultContact
, если другой объект не найден (вместо того, чтобы возвращать null). Если вы это сделаете, вам не нужно проверять наличие null
или default(T)
, поскольку вы знаете, что у вас есть объект Contact
.
Ответ 2
FirstOrDefault
вернет null
для ссылочных типов и default
для типов значений. Таким образом, ваш тест недействителен. В orther для проверки wheteher значение по умолчанию, вы должны сравнить его с default (Type)
:
Contact contact = dbo.contact.FirstOrDefault(m => m.contactName == "Stackoverflow");
if (!object.Equals(contact, default (Contact)))
// Is not default
Код выше будет работать либо с struct Contact
, либо class Contact
. Мы также предполагаем, что default (Contact)
никогда не является допустимым возвращаемым значением нашего запроса.
Ответ 3
FirstOrDefault() обозначает первый элемент, если не найден, то значение "Default" этого типа. Он внутренне использует ключевое слово default
для возврата значения по умолчанию.
использование: return default(Contact) or default(int)
например. если это тип значения let say int
, тогда он вернет 0. В случае ссылочных типов он вернет "Null
" и т.д.
Надеюсь, это имеет смысл для вас.
Ответ 4
Вы можете использовать
Contact contact = dbo.contact.where(m=>m.contactName!="" &&m.contactName!=null && m.contactName == "Stackoverflow").FirstOrDefault();
Ответ 5
Как правило, FirstOrDefault
возвращает элемент, запрошенный значением default
для типа коллекций.
В случае ссылок он null
, в случае int - 0
и т.д.