Linq Ошибка генерации SelectListItems - PullRequest
1 голос
/ 26 апреля 2010

Это странная вещь, которую я не могу понять.

Мой метод имеет один параметр, который может иметь значение null

INT? selectedtitleid

Это код Linq:

var titles = from t in dc.Titles
            select new SelectListItem 
            { 
                Text = t.Title1, 
                Value = t.TitleID.ToString(), 
                Selected = (t.TitleID == selectedtitleid)
            };

return titles.ToList(); // Error gets thrown here

Работает нормально, когда selectedtitleid не равен нулю, но выдает исключение, когда оно равно нулю.

Исключение составляют: Нулевое значение не может быть назначено члену с типом System.Boolean, который является необнуляемым типом значения.

Я сделал тест, похожий на этот

int? t1 = null;
bool b1 = (t1 == null);

И для b1 установлено значение false - так почему этого не происходит в запросе Linq?

Это, наверное, что-то простое - у кого-нибудь есть идеи?

Приветствия

Ответы [ 2 ]

1 голос
/ 26 апреля 2010

ОК, указанный вами запрос LINQ будет переведен в синтаксис SQL, например:

SELECT 
    [t0].[Title1],
    [t0].[TitleID],
    (CASE 
        WHEN [t0].[TitleID] = @p1 THEN 1
        WHEN NOT ([t0].[TitleID] = @p1) THEN 0
        ELSE NULL
     END) AS [Value]
FROM [dbo].[Titles] AS [t0]

где @p1 на самом деле ваша selectedtitleid переменная.

Теперь представьте, что selectedtitleid = null. Это означает, что ни первое условие, ни второе в блоке CASE не будут выполнены. Это связано с тем, что нулевое значение в SQL (null не равно любому другому значению, даже null). Поэтому, когда значение selectedtitleid равно null, будет возвращено значение null для поля [Value]. Вот почему вы получите свое исключение.

Обходной путь - изменить ваш код:

var titles = from t in dc.Titles
            select new SelectListItem 
            { 
                Text = t.Title1, 
                Value = t.TitleID.ToString(), 
                Selected = ((t.TitleID ?? 0) == (selectedtitleid ?? 0))
            };

Это означает, что вместо null будет сравнение целых чисел. Так что если t.TitleID равно null и selectedtitleid равно null, Selected будет установлено в значение true.

0 голосов
/ 31 мая 2012

Я только что столкнулся с этой же проблемой, когда выбранное значение было строкой, это исключение, потому что обычно в качестве выбранного значения вы бы использовали некоторый тип int или GUID. Мой обходной путь - добавить проверку строки. IsNullOrEmpty.

var x = from cp in db.CompanyPrefix
        orderby cp.CompanyPrefixName
        select new SelectListItem
                    {
                        Text = cp.CompanyPrefixName,
                        Value = cp.CompanyPrefixName,
                        Selected = (uti != null && !string.IsNullOrEmpty(uti.CompanyPrefix) && uti.CompanyPrefix == cp.CompanyPrefixName)
                    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...