这是一个我无法弄清楚的奇怪的事情。
我的方法有一个参数可以为空的
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查询中不会发生这种情况?
这可能很简单 - 任何人都有什么想法吗?
干杯
答案 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.TitleID
为null
且selectedtitleid
为null
,则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)
};