Подтвердить что ты не робот

Linq Firstordefault проверяет значение по умолчанию

как я могу проверить, действительно ли объект, возвращенный функцией linq FirstorDefault, по умолчанию?

Например

Contact contact = dbo.contact
                     .where(m=>m.contactName == "Stackoverflow")
                     .FirstOrDefault()

существует ли альтернативный способ проверки того, является ли контакт выше значением по умолчанию, а не используется:

if(!contact.contactName.equal("Stackoverflow"))
          do something
4b9b3361

Ответ 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 и т.д.