0

所以我有一个使用实体框架 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在任何地方说)。请改用 Equal 表达式。

我认为您正在寻找更多类似这些方面的东西。

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 回答