Я нашел ошибку в операторе Contains в Linq (не уверен, действительно ли это в Linq или Linq to SQL) и хочу узнать, видел ли кто-нибудь еще это и есть ли исправление или обходной путь.
Если в источнике запросов, с которым вы работаете, содержится более 10 элементов, он не передает элементы правильно в запрос SQL. Трудно объяснить, что он делает, пример покажет это лучше всего.
Если вы посмотрите на необработанный запрос, параметры будут выглядеть следующим образом:
@P0 = 'aaa'
@P1 = 'bbb'
@P2 = 'ccc'
... [@P3 through @P9]
@P10 = '111'
@P11 = '222'
... [@p12 through @P19]
@P20 = 'sss'
... [@P21 through @P99]
@P100 = 'qqq'
когда значения передаются в окончательный запрос (все параметры разрешены), он разрешает параметры, как если бы это были переданные значения:
@P0 = 'aaa'
@P1 = 'bbb'
@P2 = 'ccc'
...
@P10 = 'bbb'0
@P11 = 'bbb'1
...
@P20 = 'ccc'0
...
@P100 = 'bbb'00
Таким образом, похоже, что параметр разрешения просматривает первую цифру только после @P
и разрешает ее, а затем добавляет все, что осталось в конце имени параметра.
По крайней мере, именно так плагин Sql Server Query Visualizer для Visual Studio показывает выполнение запроса.
Действительно странно.
Так что, если у кого-то есть совет, пожалуйста, поделитесь. Спасибо!
Обновление:
Я переписал исходный оператор linq, где теперь использую объединение вместо Contains, но все же хотел бы знать, есть ли способ обойти эту проблему.