#asp.net #entity-framework #c#-4.0
#asp.net #entity-framework #c #-4.0
Вопрос:
Я ищу строку ввода из элемента управления textbox в модели данных EF. Кто-нибудь может помочь мне создать предложение where в файле code для этого. Я попробовал приведенный ниже фрагмент кода в коде, даже несмотря на то, что он компилируется, выдает ошибку, когда я ввожу строку поиска и отправляю поиск.
Where("it.[CaseName] like '%'" searchString
"'%' or it.[CaseNumber] like '%'" searchString
"'%' or it.[AppRegNumber] like '%'" searchString
"'%' or it.[SSNo] like '%'" searchString "'%'")
Когда это же предложение where использовалось в разметке элемента управления EntityDataSource, оно принимает и выполняет поиск правильно.
Я нахожусь в процессе изменения своих страниц, чтобы использовать элемент управления ObjectDataSource для подключения к классу уровня бизнес-логики вместо прямого подключения к модели данных EDM.
Комментарии:
1. Изменил предложение where на Where («это. [CaseName] например ‘%» searchString «%'» «или это. [CaseNumber] например ‘%» searchString «%’ или это. [AppRegNumber] как ‘%» searchString «%'»). Это работает
2. Кстати: Вы знаете о внедрении SQL? Помещение строки, которую пользователь вводит в текстовое поле на веб-странице, непосредственно в предложение SQL потенциально очень опасно. Именно по этой причине существует перегрузка с
ObjectParameter
, и это настоятельно рекомендуемый способ построения запроса (см. Мой ответ ниже). Вы можете посмотреть здесь, какие опасные вещи возможны при внедрении SQL: pluralsight-training.net/microsoft/players/… Случайно демо-версия идеально подходит для вашего запроса.3. @Slauma, спасибо, что напомнили об этой уязвимости. Это просто вылетело у меня из головы.
Ответ №1:
Если вы хотите использовать Where
метод построения запросов ObjectQuery
(я думаю, это то, что вы используете в своем вопросе), вам нужно удалить внутренние одинарные кавычки из выражения запроса:
Where("it.[CaseName] like '%" searchString
"%' or it.[CaseNumber] like '%" searchString
"%' or it.[AppRegNumber] like '%" searchString
"%' or it.[SSNo] like '%" searchString "%'")
Или в виде параметризованного запроса:
Where("it.[CaseName] like @search"
" or it.[CaseNumber] like @search"
" or it.[AppRegNumber] like @search"
" or it.[SSNo] like @search",
new ObjectParameter("search", string.Concat("%", searchString, "%")))
Редактировать
Не используйте первую версию, если searchString
она получена из пользовательского ввода на веб-странице, поскольку эта версия уязвима для внедрения SQL (введите этот термин в поисковую систему для пояснения). Вместо этого используйте параметризованный запрос во второй версии.
Ответ №2:
Ну, вы можете использовать методы расширения Linq:
.Where(r => r.CaseName.IndexOf(searchString) >= 0
|| r.CaseNumber.IndexOf(searchString) >= 0
|| r.AppRegNumber.IndexOf(searchString) >= 0
|| r.SSNo.IndexOf(searchString) >= 0)
Комментарии:
1. Введенная строка ‘sa’ для поиска, выдает ошибку ‘sa’ не является членом типа ‘SCDSS_ApplicationDataModel. Заявитель ‘
2. Звучит так, будто вы превращаете то, что я написал, в строку, в отличие от использования System. Linq и используя метод, который я написал. Возможно, вы захотите немного почитать о методах расширения Linq: msdn.microsoft.com/en-us/library/bb896238.aspx
3. Я изменил свой код, чтобы включить то, что вы написали, не преобразовывал это в строку. На странице поиска введен sa для запуска.