Linq IQueryable整数属性表达式在哪里使用?
所以我有一个查询,我正在使用实体框架LINQ构建。取决于搜索参数和正在搜索的参数类型 我创建了这样一个函数:Linq IQueryable整数属性表达式在哪里使用?,linq,entity-framework,linq-to-entities,iqueryable,Linq,Entity Framework,Linq To Entities,Iqueryable,所以我有一个查询,我正在使用实体框架LINQ构建。取决于搜索参数和正在搜索的参数类型 我创建了这样一个函数: public static IQueryable<T> WhereInt<T>(this IQueryable<T> query, string propertyName, string contains) { var parameter = Expression.Parameter(typeof(T), "ty
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));
}
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
整数值上没有.First()
方法。我真的不知道你为什么认为这会帮助你生成一个表达式,比如searchfield.value==search.toInt32()
(它没有说第一个
)。改用相等的表达式
我想你是在寻找更多类似的东西
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));
}
公共静态IQueryable WhereInt(IQueryable查询、字符串属性名称、字符串值)
{
var参数=表达式参数(typeof(T),“type”);
var propertyExpression=Expression.Property(参数,propertyName);
var someValue=Expression.Constant(int.Parse(value),typeof(int));
var containsExpression=Expression.Equal(propertyExpression,someValue);
返回query.Where(Expression.Lambda(containsExpression,parameter));
}
string没有名为First
的方法,这就是GetMethod(“Firts”)返回null的原因。你想干什么。您能提供示例输入和预期结果吗result@RuneFS我试图做的是有这样一个函数:query.Where(SearchField、SearchType、SearchValue);所以我做了两个函数,一个WhereInt和一个WhereString,我输入SearchField和SearchValue,我试图让它返回正确的值(对int使用相等操作“==”,或对string使用.Contains()),可能我错用了“First”,我在WhereString中使用了“Contains”。。。我将Contains改为“First”,希望这与在LINQ中使用==like相同。这个表达式仍然让我困惑typeof(string)。GetMethod(“First”)
您说您希望比较int,但正在寻找字符串上的方法,您希望得到什么1.First(someVariable)回来?我只是在做类似的实验。除了我的错误,我用了“Equals”,其中你用“Equal”和“propertyexpression,containsexpression”作为lambda的参数,而不是像你这样的“con,parameter”,呵呵。不管怎么说,测试它。所以我得到了这个错误“没有为类型'System.Nullable'1[System.Int32]和'System.Int32'定义二进制运算符Equal.”我猜是因为它是一种“允许nulls”的'int'类型,它会将它识别为int?使用.Constant()会导致失败。@Dexter:是的,没错。您可以修改该方法以将输入视为可为空的int,也可以使用表达式。Convert(Expression,Type)
模拟从int
到int?
的转换。
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));
}