,所以我有一个使用实体框架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
整数值没有.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));
}