IQueryable整数属性表达式用法在哪里?

时间:2012-10-22 17:43:36

标签: linq entity-framework linq-to-entities iqueryable

所以我有一个使用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可以是userid,username,integer或string,理想情况下我想这样做:

searchfield.value == search.toInt32()

有点特色。

我也想让DateTime类型也可搜索。也许我会为此做出WhereDateTime

我在var containsExpression = Expression.Call(propertyExpression, method, someValue);

上收到错误消息

这适用于字符串,但失败并显示错误:

Value cannot be null.
Parameter name: method

1 个答案:

答案 0 :(得分: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));
}