即使在“ HasValue”检查之后,可为空的对象也必须具有一个值

时间:2019-01-22 00:49:49

标签: c# linq-to-sql nullable

我有此LINQ to SQL查询:

int? ID = null;
var query = from t in db.things where (!ID.HasValue || t.ID == ID.Value) select t;

现在在常规LINQ中,此功能可以按预期工作,但是在LINQ to SQL中会引发“可空对象必须具有值”异常。

LINQ to SQL是否对我的空检查做了一些奇怪的解释?如果是这样,我如何正确实现此功能?

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

int? ID = null;
if(ID.HasValue)
{
   var query = from t in db.things where (t.ID == ID.Value) select t;
}
else //when ID is null
{
   var query = from t in db.things select t;
}

或者可以一行完成:

var query = ID.HasValue ? from t in db.things where (t.ID == ID.Value)select t : from t in db.things select t;

答案 1 :(得分:0)

据我所知,您是正确的SQL的Linq与此有关。根据以下问题的答案:Linq to Sql is null in Where clause,您想要这样的东西。

int? ID = null;
var query = from t in db.things where (!ID.HasValue || (ID.HasValue && t.ID == ID.Value)) select t;

答案 2 :(得分:0)

使用调试器后,确定LINQ to SQL无法理解空检查,而只是将SQL呈现如下:

SELECT [t0]
FROM [dbo].[things] AS [t0]
WHERE [t0].[ID] = @p0

因此,当要解析@p0的值时,它将尝试评估ID.Value而不考虑我的空检查。

我通过使用GetValueOrDefault()解决了这个问题:

int? ID = null;
var query = from t in db.things where (!ID.HasValue || t.ID == ID.GetValueOrDefault()) select t;

在这种情况下,它能够理解where子句,因为变量将始终评估为某种值。