在C#中使用动态或表达式 [英] Using Dynamic Or Expressions in C#
本文介绍了在C#中使用动态或表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
public static IQueryable< T> MyFilter< T>(此IQueryable< T>可查询)其中T:class,IModel
{
var someIds = new int [] {1,2,3,4,5};
var userId = 2;
表达式< Func< T,bool>>> predicate1 = e => someIds.Contains(e.Id);
表达式< Func< T,bool>>> predicate2 = e => e.UserId ==用户id;
表达式< Func< T,bool>>>谓词3 = e => e.CreatedDate!= null;
var pred1 = Expression.Lambda< Func< T,bool>>(System.Linq.Expressions.Expression.Or(predicate1,predicate2));
var pred2 = Expression.Lambda< Func< T,bool>>(System.Linq.Expressions.Expression.Or(pred1,predicate3));
var result = queryable
.Where(pred2);
返回结果;
}
IModel
像这样:
公共界面IModel {
int Id {get;组; }
int UserId {get;组; }
DateTime? CreatedDate {get;组; }
}
但是我收到这个错误:
二进制运算符或未定义为类型'System.Func
2 [AnyClass,System.Boolean]'和'System.Func
2 [AnyClass,System.Boolean]'。
在这一行:
var pred1 = Expression.Lambda&FunC< T,bool>>(System.Linq.Expressions.Expression.Or(predicate1,predicate2));
如何解决这个问题?
预先感谢任何帮助
解决方案
您可以创建一个没有Expression.Or的谓词:
public static IQueryable< T> MyFilter< T>(此IQueryable< T可查询)其中T:class,IModel
{
var someIds = new int [] {1,2,3,4,5};
var userId = 2;
var result = queryable
.Where(e => someIds.Contains(e.Id)|| e.UserId == userId || e.CreatedDate!= null);
返回结果;
}
I use the dynamic filter in my program like following solution:
public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable) where T : class ,IModel
{
var someIds = new int[]{1,2,3,4,5};
var userId = 2;
Expression<Func<T, bool>> predicate1 = e => someIds.Contains(e.Id);
Expression<Func<T, bool>> predicate2 = e => e.UserId==userId;
Expression<Func<T, bool>> predicate3 = e => e.CreatedDate != null;
var pred1 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(predicate1, predicate2));
var pred2 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(pred1, predicate3));
var result = queryable
.Where(pred2);
return result;
}
The IModel
is like this:
Public interface IModel{
int Id { get; set; }
int UserId { get; set; }
DateTime? CreatedDate { get; set; }
}
but, I get this error:
The binary operator Or is not defined for the types 'System.Func
2[AnyClass,System.Boolean]' and 'System.Func
2[AnyClass,System.Boolean]'.
at this line:
var pred1 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(predicate1, predicate2));
How can I solve this problem?
beforehand appreciate any help
解决方案
You can create one predicate without Expression.Or:
public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable) where T : class ,IModel
{
var someIds = new int[] { 1, 2, 3, 4, 5 };
var userId = 2;
var result = queryable
.Where(e => someIds.Contains(e.Id) || e.UserId == userId || e.CreatedDate != null);
return result;
}
这篇关于在C#中使用动态或表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文