2

IQueryable データ ソースで検索したい次の値があります。

ユーザーは、Silverlight アプリケーションのテキスト ボックスに値を入力して結果をフィルター処理できます。これらの入力はフィルター処理され、ドメイン サービスに送信されます。

「*」は、ユーザーがワイルドカード検索を行うために入力できるものです。たとえば、「TYPE」が「P32」で始まるすべての値を返します。

List<string> params = new List<string>() { "P32*", "P4552", "P2311" };

次に、このリストをドメイン サービス コードの関数に渡します。

IQueryable<MyClass> temp = this.ObjectContext.MyClass.AsQueryable();
temp = temp.Where(c => params.Contains(c.TYPE));

これは、ワイルドカード検索を実装する前に行ったことです。これを行う最もクリーンな方法は何でしょうか? paramsリストをループして、各文字列でContainsを試すようなことをしなければならないと思っていました(さらに文字列を操作した後)が、その方法はとても汚れているように感じます

foreach (string x in params)
{
    //look for * wildcard... do some other stuff 
    temp = temp.Where(c=>c.TYPE.Contains(x));
}
4

1 に答える 1

1

これを行うには、ワイルドカードがどのように機能するかを完全に定義する必要があります。それができたら、次の関数の空白を埋めるだけです。

public static class WildcardExtensions
{
    public static bool WildcardContains(this IEnumerable<string> patterns, string value)
    {
        return patterns.Any(pattern => MatchesWildcard(pattern, value));
    }

    private static bool MatchesWildcard(string pattern, string value)
    {
        // implement your pattern matching logic here
    }
}

そして、あなたのコードは少し変わります:

temp = temp.Where(c => params.WildcardContains(c.TYPE));
于 2012-11-27T18:57:41.447 に答える