我有此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是否对我的空检查做了一些奇怪的解释?如果是这样,我如何正确实现此功能?
答案 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子句,因为变量将始终评估为某种值。