Linq to sql Linq生成SelectListItems时出错
这是一个奇怪的问题,我想不出来 我的方法有一个参数可以为null的int 智力?selectedtitleid 这是Linq代码: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(),
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干杯