1

私は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;
    }
}

}
4

1 に答える 1