Как искать одну и ту же строку поиска в нескольких столбцах?

#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 для запуска.