Как я заставляю Linq к SQL распознавать набор результатов динамической Хранимой процедуры?

Это решение Серада, а не мое.

Моя проблема заключалась в том, что мой Constants.php находился в корневой папке проекта.

Мне пришлось переместить файл Constants.php в папку src, так что добавление его в корень src (в отличие от корня проекта) исправило его.

8
задан Community 23 May 2017 в 11:45
поделиться

2 ответа

Сначала - ВАЖНЫЙ - Ваш SQL уязвим для инжекции; внутренняя команда должна быть параметризована:

if len(@l_author) > 0
set @sql =  @sql + ' and author like ''%''+@author+''%'''

EXECUTE sp_executesql  @sql, N'@author varchar(100)', @L_author

Это передает значение @L_author в как @author параметр в динамической команде - предотвращение инжекционных нападений.


Второй - Вам действительно не нужна временная таблица. Это ничего не делает для Вас... Вы просто ВСТАВЛЯЕТЕ и ВЫБИРАЕТЕ. Возможно, просто ДОЛЖНОСТНОЕ ЛИЦО и позволило результатам течь вызывающей стороне естественно?

При других обстоятельствах табличная переменная была бы более соответствующей, но это не работает со ВСТАВКОЙ/ДОЛЖНОСТНЫМ ЛИЦОМ.


Действительно ли столбцы являются тем же для каждого вызова? Если так, или запишите dbml вручную или используйте временный SP (только с "ГДЕ 1=0" или что-то) так, чтобы SET FMT_ONLY ON может работать.

Если не (различные столбцы на использование), то нет легкого ответа. Возможно, используйте обычный ADO.NET в этом случае (ExecuteReader/IDataReader - и возможно ровный DataTable.Fill).

Конечно, Вы могли позволить LINQ взять деформацию... (C#):

...
if(!string.IsNullOrEmpty(author)) {
    query = query.Where(row => row.Author.Contains(author));
}
...

и т.д.

5
ответ дан 5 December 2019 в 17:42
поделиться

Нет никакого очень легкого способа сделать это. У меня была та же проблема в прошлом. Я думаю, что проблема - то, что Linq к Sql не имеет никакого способа "выяснить", какой тип будет возвращен, так как Вы создаете оператор SELECT во время выполнения. То, что я сделал для обхождения этого, было в сохраненном proc, я сделал просто выбор и выбрал все столбцы, в которых я возможно нуждался. Затем у меня был Linq к Sql, генерируют функцию на основе этого. Затем я вернулся к SQL и изменил сохраненный proc назад на способ, которым он, как предполагается. Прием здесь не должен повторно создавать Ваш DBML.

5
ответ дан 5 December 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: