0

だから私はEntity Framework、LINQを使って構築しているクエリを持っています。検索パラメーター、および検索されるパラメーターのタイプによって異なります。

次のような関数を作成しました。

public static IQueryable<T> WhereInt<T>(this IQueryable<T> query, string propertyName, string contains)
        {
            var parameter = Expression.Parameter(typeof(T), "type");
            var propertyExpression = Expression.Property(parameter, propertyName);

            MethodInfo method = typeof(string).GetMethod("First");
            var someValue = Expression.Constant(contains, typeof(string));
            var containsExpression = Expression.Call(propertyExpression, method, someValue);

            return query.Where(Expression.Lambda<Func<T, bool>>(containsExpression, parameter));

        }

次のように使用されます。

WhereInt(DCs, searchfield, search);

searchfieldユーザーID、ユーザー名、整数、または文字列である可能性があり、理想的には次のことを行います。

searchfield.value == search.toInt32()

一種の特徴。

DateTimeタイプも検索可能にしたいです。多分私はそのために作るでしょうWhereDateTime

エラーが発生しますvar containsExpression = Expression.Call(propertyExpression, method, someValue);

これは文字列では問題なく動作しますが、次のエラーで失敗します:

Value cannot be null.
Parameter name: method
4

1 に答える 1

2

.First()整数値に対するメソッドはありません。(どこsearchfield.value == search.toInt32()にも言っていない)のような式を生成するのに役立つと思った理由が本当にわかりません。First代わりに等式を使用してください。

これらの線に沿ってもっと何かを探していると思います。

public static IQueryable<T> WhereInt<T>(IQueryable<T> query, string propertyName, string value)
{
    var parameter = Expression.Parameter(typeof(T), "type");
    var propertyExpression = Expression.Property(parameter, propertyName);

    var someValue = Expression.Constant(int.Parse(value), typeof(int));
    var containsExpression = Expression.Equal(propertyExpression, someValue);

    return query.Where(Expression.Lambda<Func<T, bool>>(containsExpression, parameter));
}
于 2012-10-22T18:07:42.507 に答える