8,492
社区成员
发帖
与我相关
我的任务
分享ParameterExpression parameter = Expression.Parameter(typeof(T), "c");
Expression property = Expression.Property(parameter, typeof(T).GetProperty(field));
Expression notEqual = Expression.NotEqual(property, Expression.Constant(null));
Expression pred = Expression.Lambda(notEqual, parameter);Delegate GetWhere<T>(string field)
{
Type ienum = typeof(IEnumerable<T>);
ParameterExpression parameter = Expression.Parameter(typeof(IEnumerable<T>), "c");
ParameterExpression linqParameter = Expression.Parameter(typeof(T), "x");
Expression property = Expression.Property(linqParameter, typeof(T).GetProperty(field));
Expression notequal = Expression.NotEqual(property, Expression.Constant(null));
var methods = typeof(Enumerable).GetMethods().Where(x => x.Name == "Where").First();
var methodWhere = methods.MakeGenericMethod(typeof(T));
Expression Where = Expression.Call(methodWhere, parameter, Expression.Lambda(notequal, linqParameter));
return Expression.Lambda(Where, parameter).Compile();
}
可以获取IEnumable<T>的Where(x=>x.field != null)方法
var d = GetWhere<Entity>("data");
d.DynamicInvoke( tIQueryable.AsQueryable() );
可以获取data不为空的列表
你自己也可以改写一下适合你的用途[/quote]
谢谢大神

Delegate GetWhere<T>(string field)
{
Type ienum = typeof(IEnumerable<T>);
ParameterExpression parameter = Expression.Parameter(typeof(IEnumerable<T>), "c");
ParameterExpression linqParameter = Expression.Parameter(typeof(T), "x");
Expression property = Expression.Property(linqParameter, typeof(T).GetProperty(field));
Expression notequal = Expression.NotEqual(property, Expression.Constant(null));
var methods = typeof(Enumerable).GetMethods().Where(x => x.Name == "Where").First();
var methodWhere = methods.MakeGenericMethod(typeof(T));
Expression Where = Expression.Call(methodWhere, parameter, Expression.Lambda(notequal, linqParameter));
return Expression.Lambda(Where, parameter).Compile();
}
可以获取IEnumable<T>的Where(x=>x.field != null)方法
var d = GetWhere<Entity>("data");
d.DynamicInvoke( tIQueryable.AsQueryable() );
可以获取data不为空的列表
你自己也可以改写一下适合你的用途
自己摸索了下写出来了,顺便学了个Func,不过还是谢谢大神。
public Expression<Func<T,bool>> LambdaExpressionQueryByField<T>(string field)
{
ParameterExpression parameter = Expression.Parameter(typeof(T), "e");
Expression property = Expression.Property(parameter, typeof(T).GetProperty(field));
Expression notEqual = Expression.NotEqual(property, Expression.Constant(null));
return Expression.Lambda<Func<T,bool>>(notEqual, parameter);
}
不好意思了,我是业余编程
改完后报另一个错了: 类型“EF.Model.BaseBar”上没有方法“Where”。
这方法我也是网上抄的。麻烦大神能否给个完整方法和调用示例,我用的是efcore.