LINQを使用すると、独自のワイルドカード(WHERE LIKE)を使用してテーブルをクエリする必要がありContains
、ワイルドカードをエスケープし続けるため、通常の方法を使用できませんでした(他の質問を参照)。完璧に機能する拡張メソッドを見つけましたが、文字列列でのみ機能します。
public static IQueryable<T> WhereLike<T>(this IQueryable<T> source, string propertyName, string pattern)
{
if (null == source) throw new ArgumentNullException("source");
if (string.IsNullOrEmpty(propertyName)) throw new ArgumentNullException("propertyName");
var a = Expression.Parameter(typeof(T), "a");
var prop = Expression.Property(a, propertyName);
var body = Expression.Call(typeof(SqlMethods), "Like", null, prop, Expression.Constant(pattern));
var fn = Expression.Lambda<Func<T, bool>>(body, a);
return source.Where(fn);
}
上記の方法の使用例を次に示します。
db.TABLE_NAME.WhereLike("COLUMN_NAME", "SEARCH%");
前述したように、これは文字列列でうまく機能しますが、intなどの非文字列列でこのメソッドを使用しようとすると、次のエラーが発生します。
No method 'Like' on type 'System.Data.Linq.SqlClient.SqlMethods' is compatible with the supplied arguments.
文字列以外の列に対してLIKE操作を実行することはできないため、これは理解できます。最初にデータを文字列にキャストまたは変換する必要があります。私はLINQ式にあまり詳しくないのでWhereLike
、キャストまたはToString()
最初に実行するために上記のメソッドを変更する方法がわかりません。文字列以外の列でワイルドカード検索を実行できるように、これを実行することを誰かが知っていますか?