Выражения / ограничения NHybrinate IN, превышающие ограничение 2100 параметров SQL Server - PullRequest
0 голосов
/ 05 июня 2019

Есть ли способ заставить NHybrinate выполнить запрос, не выполняя его как параметризованный запрос.В основном я сталкиваюсь с проблемой, когда я достигаю предела 2100 параметров SQL Server.

Достигнут предел из-за ограничения "IN" в моем запросе.По причинам, по которым я не буду вдаваться в подробности, мне нужно использовать NHybrinate In Restriction в моем запросе.

Query.Add(Restrictions.In("df.ID", myList));

Я запустил профилировщик NHybrinate для запроса, и NHybrinate передает каждое значение «In» в качестве параметра, а не литеральное значение.

myList - это массив с более чем 5201 значением.Я исследовал в Интернете, нет ограничений на количество значений IN, которые вы можете передать в SQL, поэтому если я смогу заставить NHybrinate передавать значения в виде литеральных значений вместо параметров, которые должны решить мою проблему.

Любая помощь будет оценена.Также, пожалуйста, не комментируйте мое использование оператора IN, я столкнулся с проблемой, когда мой запрос требует, чтобы я использовал оператор IN таким образом, и я не могу подойти к нему другим способом.

1 Ответ

0 голосов
/ 15 июня 2019

Я смог решить эту проблему с помощью оператора SQL Criterion, добавленного к моему запросу, и в сочетании с использованием табличного параметра.

Вместо этого:

Query.Add(Restrictions.In("df.ID", myList));

Я использовал это:

Query.Add(new SQLCriterion(new SqlString(string.Format("this_.ID NOT IN (SELECT * FROM [dbo].[Explode] ('{0}'))", siteProdIds)), new object[0], new IType[0]))

Затем я создал эту функцию в моей базе данных:

CREATE FUNCTION [dbo].[Explode](
    @string    varchar(MAX) -- '1,2,3,5,6,7'
)
RETURNS @table TABLE(element int)
AS
BEGIN
DECLARE @temp varchar(MAX), @delimPos AS tinyint = 0         
SET @temp= LTRIM(RTRIM(@string))
WHILE CHARINDEX(',',@temp) > 0 
BEGIN 
SET @delimPos = CHARINDEX(',',@temp)
INSERT INTO @table(element) VALUES (CAST((LEFT(@temp,@delimPos-1)) AS int))
SET @temp= RTRIM(LTRIM(SUBSTRING(@temp,@delimPos+1,LEN(@temp)-@delimPos))) 
END 
INSERT INTO @table(element) VALUES (CAST((@temp) AS int))
RETURN
END
...