2013-11-14 2 views
1

Я использую ASP.NET MVC5 с Entity Framework 6, SQL Server 2012 и в настоящее время после того, как я возвращаю свой Iqueryable для своих данных, а затем звоню в список. Я вызываю свое расширение строки, для которого применяется поисковый запрос пользователей. Я хотел бы применить это в запросе Iqueryable aka sql или получить аналогичную функциональность по-другому. В настоящее время пользователь может искать слова не по порядку, они могут использовать кавычки для поиска всего набора текста в порядке с пробелами. Они также могут использовать wild card, если они не знают определенного числа или буквы.Как преобразовать метод расширения строки в хранимую процедуру в SQL?

Вот моя строка расширение

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 
using System.Web; 

namespace casey.Helpers 
{ 
public static class SearchStringExtension 
{ 
      public static bool Like(this string str, string value) 
    { 
     List<string> formatedsearch = new List<string>(); 
     string searchForNext = (""); 
     string searchForx = value; 
     searchForx = searchForx.ToUpper(); 
     searchForx = searchForx.Replace("\\", @"\\"); 
     searchForx = searchForx.Replace("*", @"\*").Replace("+", @"\+").Replace(":", @"\:").Replace("#", @"\#"); 
     searchForx = searchForx.Replace("(", @"\(").Replace(")", @"\)").Replace("<", @"\<").Replace(">", @"\>"); 
     searchForx = searchForx.Replace("{", @"\{").Replace("}", @"\}").Replace("[", @"\[").Replace("]", @"\]"); 
     searchForx = searchForx.Replace("=", @"\=").Replace("-", @"\-").Replace("_", @"_").Replace("%", @"\%"); 
     searchForx = searchForx.Replace("|", @"\|").Replace("!", @"\!").Replace("^", @"\^").Replace("%", @"\%"); 
     searchForx = searchForx.Replace(".", @"\."); 
     searchForx = searchForx.Replace("?", "."); 
     string s = searchForx; 

     //find all words with quotes around them 
     //example search string equals I "Like" Fish. 
     //asigns Like to rgx 
     Regex rgx = new Regex("\"(.+?)\""); 
     s = "^"; 


     // add regular and expression with ignore of all charactes before clause to all quoted words and and clause 
     //example ^(?.*Like) 
     foreach (Match match in rgx.Matches(searchForx)) 
     { 
      s += "(?=.*" + match.Value.Trim('"') + ")"; 
     } 

     //example I "Like" Fish. becomes I Fish 
     searchForNext = Regex.Replace(searchForx, "\"(.+?)\"", ""); 

     //this formats regular non quoted part of string 
     char[] delimiter1 = new char[] { ' ' }; 
     formatedsearch = searchForNext.Split(delimiter1, StringSplitOptions.RemoveEmptyEntries).ToList(); 

     //example I Fish becomes ^(?.*Like)(?=.*I)(?=.*Fish) 
     foreach (string searchvalue in formatedsearch) 
     { 
      s += "(?=.*" + searchvalue + ")"; 
     } 

     //this ignores case and ignores endline characters 
     if (!string.IsNullOrEmpty(str)) 
     { 
      Regex r = new Regex(s, RegexOptions.Singleline); 
      if (r.IsMatch(str.ToUpper())) 
       return true; 
     } 

     return false; 
    } 
} 

} 
+0

Что это вообще связано с SQL Server? Нигде я не вижу ничего связанного с базой данных. –

+0

это метод расширения строки, который используется в моем предложении where, например CarService.GetAllCars(). Где (u => u.PartDescription.Like (SearchSample)). OrderByDescending (s => s.SubmittalDate). Like is my string extension –

ответ

0

Я рекомендую вам использовать Full-Text Search.

Философия полнотекстового поиска состоит в том, что, когда ваши данные персонажа выходят за пределы (я думаю, что это длина 1000), SQL Server больше не может его искать, используя оператор LIKE. Таким образом, Microsoft внесла полнотекстовый поиск.

Он содержит почти все аспекты поиска внутри. Например, он выполняет лингвальный поиск, а это означает, что синонимы будут также учитываться. Или это нечеткий поиск, а это означает, что только совпадения недостаточно, и вес ключевого слова в целевом тексте также имеет значение.

Однако, если вы по-прежнему хотите, чтобы пользователь выполнил простой поиск, который вы предоставили в своей строке, я предоставил вам запрос.

+0

Если у вас есть ссылка на хороший пример использования этого для такой ситуации, как моя, я был бы признателен. Я попытался добавить Full-Text к моему db раньше, и использование расширения FreeText в sql не дал мне то, что я был после. Я предполагаю, что у меня плохое представление о том, как это можно реализовать в соответствии с моими требованиями. –

Смежные вопросы