Linq生成SelectListItems时出错

时间:2010-04-26 13:05:35

标签: linq-to-sql

这是一个我无法弄清楚的奇怪的事情。

我的方法有一个参数可以为空的

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不为null时它工作正常 - 但是当它为null时抛出异常。

例外是: 无法将null值赋给System.Boolean类型的成员,该类型是不可为空的值类型。

我做了一个像这样的测试

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

并且b1设置为false - 那么为什么Linq查询中不会发生这种情况?

这可能很简单 - 任何人都有什么想法吗?

干杯

2 个答案:

答案 0 :(得分:1)

好的,您提供的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的insted会有整数比较。因此,如果t.TitleIDnullselectedtitleidnull,则Selected将设置为true。

答案 1 :(得分:0)

当选定的值是一个字符串时,我遇到了同样的问题,这是一个例外,因为通常你会有某种int或GUID作为选择的值。我的解决方法是为string.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)
                    };