2016-03-07 2 views
2

Я пытаюсь найти решение для этого, так как часть несколько часов, и я чувствую, что мой мозг готов помочь. У меня есть следующий запрос LINQ.Как получить такую ​​же функциональность как ISNULL in LINQ query

DropDownListItem item = (
        from c in context.Practitioners 
        where c.PractitionerID == id 
        select new DropDownListItem 
        { 
         Id = c.PractitionerID, 
         DisplayValue = c.FirstName + " " + c.MiddleName + " " + c.LastName, 
         IsActive = c.IsActive, 
         DisplayOrder = c.PractitionerID, 
         CreatedById = new Guid("COFFEEOO-LOVE-LIFE-LOVE-C0FFEEC0FFEE"), 
         CreatedDate = c.CreatedDate, 
        }).FirstOrDefault() ?? new DropDownListItem(); 

       response.Data = item; 

Есть моменты, когда c.MiddleName может быть пустым. Как я могу обработать его в этом запросе, чтобы, если c.MiddleName имеет значение null, я могу просто присвоить ему пустую строку? Вот что я пробовал уже, что не получилось. - Создано расширение для проверки IsNullOrEmpty. Я узнал, что это не работает с запросами LINQ. - попытался преобразовать c.Middle в строку, выполнив что-то вроде c.MiddleName.ToString(), который также не работал для запроса LINQ. Пожалуйста, дайте мне больше указания относительно того, к чему я должен двигаться. Благодаря!

ответ

0

Вы можете проверить нули и пустые строки, а не с помощью каких-либо методов, LINQ для лиц, не понимает (Trim будет переведен на SQL):

DisplayValue = c.FirstName + " " + ((c.MiddleName == null || c.MiddleName.Trim() == string.Empty) ? string.Empty : (c.MiddleName + " ")) + c.LastName, 
+0

Это дает мне исключение: «Невозможно применить тип« System.Boolean »к типу« System.Object ». LINQ to Entities поддерживает только листинг примитивных или перечисляемых типов EDM». –

+0

Спасибо @sarvana. Он отлично работает после редактирования! –

+0

это тоже работает: DisplayValue = (c.FirstName ?? string.Empty) + "" + (c.MiddleName ?? string.Empty) + "" + (c.LastName ?? string.Empty) – Coding4Fun

2

Я предполагаю, что вы имеете в виду c.MiddleName является Пустое то, что c.MiddleName имеет значение null (потому что, если это пустая строка, вопрос не имеет смысла: p).

Если это действительно так, попробуйте написать c.MiddleName ?? ""

Это означает, что если левая часть ?? равно нулю использование правая часть выражения

См https://msdn.microsoft.com/en-us/library/ms173224.aspx для получения дополнительной документации

И вам необходимо будет изменить код таким образом:

DropDownListItem item = (
        from c in context.Practitioners 
        where c.PractitionerID == id 
        select new DropDownListItem 
        { 
         Id = c.PractitionerID, 
         DisplayValue = (c.FirstName ?? "") + " " + (c.MiddleName ?? "") + " " + (c.LastName ?? ""), 
         IsActive = c.IsActive, 
         DisplayOrder = c.PractitionerID, 
         CreatedById = new Guid("COFFEEOO-LOVE-LIFE-LOVE-C0FFEEC0FFEE"), 
         CreatedDate = c.CreatedDate, 
        }).FirstOrDefault() ?? new DropDownListItem(); 

       response.Data = item; 

Не должно быть что оператор ?? имеет один из самых низких приоритетов в C#. Проверьте приоритет операторов в C# здесь https://msdn.microsoft.com/en-us/library/6a71f45d.aspx

+0

Я использовал ваше предложение , Теперь он просто возвращает LastName. Этот человек, на которого я смотрю, имеет имя и фамилию, а не второе имя. Поэтому я ожидаю, что отображаемое значение будет первым и фамильным. –

+0

Извините, что я хотел сказать, что теперь он возвращает только FirstName.Нет имени, даже если у этого человека есть фамилия –

+1

Это должно быть '(c.FirstName ??" ") +" "+ (c.MiddleName ??" ") +" "+ (c.LastName ??" ") '. Сейчас это то же самое, что 'c.FirstName ?? ("" + "" + c.MiddleName ?? ("" + "" + c.LastName ?? "")) ' – juharr

0

попробовать это

DisplayValue = (c.FirstName?? string.Empty) + " " + (c.MiddleName ?? string.Empty) + " " + (c.LastName?? string.Empty) 
+0

Это просто возвращает имя, даже если эта запись имеет фамилию. Я бы ожидал, что первое и последнее имя будут записаны в записи. –

+0

Я отредактировал свой ответ, теперь он отлично работает – Coding4Fun

1

Я немного запутался о вашем вопросе. Вы создаете строку, поэтому даже если c.MiddleName имеет значение null, ее следует интерпретировать как пустую строку.

Вы также можете попробовать это:

 DisplayValue = (c.MiddleName != null) ? 
c.FirstName + " " + c.MiddleName + " " + c.LastName : 
c.FirstName + " " + c.LastName, 

Но почти все другие ответы очень похожи.

Обратите внимание, что вы отсутствуете скобки за select new DropDownListItem, так что это может быть проблема.

+0

Запрос выглядит как EF. Это означает, что он переведен на SQL, где конкатенирование строкового значения 'null' будет вести себя иначе, чем в C#. Кроме того, вам не нужны скобки '()' при использовании инициализаторов объектов. – juharr

Смежные вопросы