私はEntity Framework 6、SQLサーバー2012でASP.NET MVC5を使用しています。現在、データのIqueryableを返し、tolistを呼び出した後、ユーザーの検索クエリを適用する文字列拡張を呼び出します。これを Iqueryable 別名 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;
}
}
}