所以我有一个使用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
答案 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));
}