【发布时间】:2018-02-27 07:34:00
【问题描述】:
我正在尝试动态创建表达式,但我无法弄清楚...也不想这样使用..
if (item.id == 1) filter.AddExpression(c => filterValues.Contains(c.a1));
if (item.id == 2) filter.AddExpression(c => filterValues.Contains(c.a2));
if (item.id == 3) filter.AddExpression(c => filterValues.Contains(c.a3));
if (item.id == 4) filter.AddExpression(c => filterValues.Contains(c.a4));
...
var filtervalues = new List<int>(){1,2,3,4...}
Filter<TestSubject> filter = new Filter<TestSubject>(null);
如何通过迭代实现这一点...这是一个 Web 项目,并提交了 ids 和它们的值来自 IQueryCollection 转换键和值以使用实体框架查询 mysql...对于 Where in 子句试图做这。如果存在另一种方式表示赞赏,但现在我有这种强大的 :) 方式并且无法完成......
foreach (var field in QueryFields)
{
filter.AddExpression(c => filterValues.Contains(c=>"a"+field.id)); // Trying to do this
}
public class TestSubject
{
public int? a1 { get; set; }
public int? a2 { get; set; }
public int? a3 { get; set; }
public int? a4 { get; set; }
}
public class Filter<TEntity>
{
public Filter(Expression<Func<TEntity, bool>> expression)
{
Expression = expression;
}
public Expression<Func<TEntity, bool>> Expression { get; private set; }
public void AddExpression(Expression<Func<TEntity, bool>> newExpression)
{
if (newExpression == null) throw new ArgumentNullException(nameof(newExpression), $"{nameof(newExpression)} is null.");
if (Expression == null) Expression = newExpression;
var parameter = System.Linq.Expressions.Expression.Parameter(typeof(TEntity));
var leftVisitor = new ReplaceExpressionVisitor(newExpression.Parameters[0], parameter);
var left = leftVisitor.Visit(newExpression.Body);
var rightVisitor = new ReplaceExpressionVisitor(Expression.Parameters[0], parameter);
var right = rightVisitor.Visit(Expression.Body);
Expression = System.Linq.Expressions.Expression.Lambda<Func<TEntity, bool>>(System.Linq.Expressions.Expression.AndAlso(left, right), parameter);
}
}
【问题讨论】:
-
Contains不需要 lambda?QueryFields的类型是什么?你看过 LINQKit,特别是 PredicateBuilder 吗? -
您的代码无法编译,因为您不能在
List<int>上使用int?调用Contains。 -
是的,int 和 int?问题出现了,Expression.GreaterThanOrEqual 也有问题,所以需要使用 Expression.Convert.. 谢谢
标签: linq reflection lambda entity-framework-core