Какого черта происходит с этим запросом Linq-to-SQL? - PullRequest
1 голос
/ 15 апреля 2010

[Решено - см. Обновление]

У меня есть этот запрос L2S (выглядит страшно, но бит, который идет не так просто):

var historicDataPointValues = from dpv in this._dataContext.DataPointValues
                              where (dpv.categoryId == historicCategoryId)
                              && (dpv.retailerId == historicRetailerId)
                              && (dpv.questionId == question.PreviousQuestionId)
                              && historicResponseIds.Contains(dpv.responseIndex)
                              && ((dpv.dataPointIndex == firstDataPointIndex) || (dpv.dataPointIndex == secondDataPointIndex))
                              select new KeyValuePair<string, double>(MakeDataPointValueKey(dpv), dpv.value);

... который не дал результатов, поэтому я посмотрел на SQL, излучаемый L2S.

Когда я его выполняю, значение firstDataPointIndex равно 1, а secondDataPointIndex равно нулю. Тем не менее, запрос, который создает L2S (как показано в отладчике):

SELECT [t0].[categoryId], [t0].[retailerId], [t0].[questionId], [t0].[responseIndex], [t0].[dataPointIndex], [t0].[value]
FROM [dbo].[DataPointValue] AS [t0]
WHERE ([t0].[categoryId] = 1)
AND ([t0].[retailerId] = 1)
AND (([t0].[questionId]) = 8)
AND ([t0].[responseIndex] IN (1, 3, 4, 5, 6, 7, 8, 10, 11, 12))
AND (([t0].[dataPointIndex] = 13) OR ((CONVERT(Int,[t0].[dataPointIndex])) = 14))

Обратите внимание на значения 13 и 14, где firstDataPointIndex и secondDataPointIndex должны быть (они должны быть 1 и NULL; если я введу правильные значения, то получу ожидаемые результаты).

WTF


ОБНОВЛЕНИЕ : Оказывается, что отладчик L2S был неисправен. Он не отображал тот же SQL, что и фактически отправленный на сервер, а именно:

exec sp_executesql N'SELECT [t0].[categoryId], [t0].[retailerId], [t0].[questionId], [t0].[responseIndex], [t0].[dataPointIndex], [t0].[value]
FROM [dbo].[DataPointValue] AS [t0]
WHERE ([t0].[categoryId] = @p0) AND ([t0].[retailerId] = @p1) AND (([t0].[questionId]) = @p2) AND ([t0].[responseIndex] IN (@p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12)) AND (([t0].[dataPointIndex] = @p13) OR ((CONVERT(Int,[t0].[dataPointIndex])) = @p14))',N'@p0 int,@p1 int,@p2 int,@p3 int,@p4 int,@p5 int,@p6 int,@p7 int,@p8 int,@p9 int,@p10 int,@p11 int,@p12 int,@p13 int,@p14 int',@p0=1,@p1=1,@p2=8,@p3=1,@p4=3,@p5=4,@p6=5,@p7=6,@p8=7,@p9=8,@p10=9,@p11=10,@p12=11,@p13=1,@p14=NULL

Обратите внимание, что запрос теперь содержит @ p13 и @ p14, где ранее он имел скалярные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...