Linq to sql Linq生成SelectListItems时出错

Linq to sql Linq生成SelectListItems时出错,linq-to-sql,Linq To Sql,这是一个奇怪的问题,我想不出来 我的方法有一个参数可以为null的int 智力?selectedtitleid 这是Linq代码: var titles = from t in dc.Titles select new SelectListItem { Text = t.Title1, Value = t.TitleID.ToString(),

这是一个奇怪的问题,我想不出来

我的方法有一个参数可以为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不为null时,它可以正常工作,但当它为null时会引发异常

例外情况是: 无法将null值分配给System.Boolean类型的成员,该类型是不可为null的值类型

我做了一个类似这样的测试

int? t1 = null;
bool b1 = (t1 == null);
b1被设置为false——那么为什么在Linq查询中不发生这种情况呢

这可能很简单,有人有什么想法吗


干杯

好的,您提供的
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
。这意味着
案例中的第一个条件,而不是第二个条件都不会得到满足。这是因为
SQL
中的null值(
null
甚至不等于任何其他值
null
)。因此,当
selectedtitleid
值为
null
时,将返回
[value]
字段的
null
值。这就是为什么你会得到例外

解决方法是更改代码:

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。

确定,您提供的
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
。这意味着
案例中的第一个条件,而不是第二个条件都不会得到满足。这是因为
SQL
中的null值(
null
甚至不等于任何其他值
null
)。因此,当
selectedtitleid
值为
null
时,将返回
[value]
字段的
null
值。这就是为什么你会得到例外

解决方法是更改代码:

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。

当所选值为字符串时,我遇到了同样的问题,这是一个例外,因为通常您会使用某种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)
                    };

当选择的值是字符串时,我遇到了同样的问题,这是一个例外,因为通常选择的值是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)
                    };

啊,好男人-那太完美了:)我真的试过了(t.TitleID==selectedtitleid)??false-但是因为它将其更改为SQL,所以它不起作用:)谢谢AlexAhhh好人-这很完美:)我确实尝试过(t.TitleID==selectedtitleid)??false-但是因为它将其更改为SQL,所以它没有工作:)Alex干杯