Обнуляемый объект должен иметь значение даже после проверки «HasValue» - PullRequest
0 голосов
/ 22 января 2019

У меня есть этот запрос 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 голосов
/ 22 января 2019

Из того, что я вижу, вы правы, у Linq to SQL есть проблема с этим.Основываясь на ответе на этот вопрос: Linq to Sql равен нулю в предложении Where , вместо этого вы хотите что-то подобное.

int? ID = null;
var query = from t in db.things where (!ID.HasValue || (ID.HasValue && t.ID == ID.Value)) select t;
0 голосов
/ 22 января 2019

Хорошо, после использования отладчика, выясняется, что 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, поскольку переменная всегда будет иметь какое-либо значение.

0 голосов
/ 22 января 2019

Вы можете сделать что-то вроде:

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;
...