简体   繁体   English

需要帮助为 Where 子句创建表达式树

[英]Need help creating an expression tree for Where clause

I need to create an expression tree, which I can pass along as predicate argument in Where clause to Linq To Enities query.我需要创建一个表达式树,我可以将其作为Where子句中的predicate参数传递给 Linq To Enities 查询。

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source,
    Expression<Func<TSource, bool>> predicate);

Expression tree must be equivalent to where clause specified as below:表达式树必须等效于如下指定的 where 子句:

var query = context.Products.Select(product => 
    new { product.Name, product.Color });

var arr = "Red;Black".Split(';');
query = query.Where(obj => arr.Contains(obj.Color));

Googled it out!谷歌一下!

var paramExpr = Expression.Parameter(typeof(TSource), "src");
var memberExpr = (MemberExpression)property.Body;

List<Expression> arrayInits = new List<Expression>();

var arrExpr = Expression.Constant(((string)values[0]).Split(new char[] { ';' }));

MethodInfo containsMethod = typeof(ICollection<string>).GetMethod("Contains");

var containsExpression = Expression.Call(null, contains, arrExpr, memberExpr);
var containsLambda = Expression.Lambda<Func<TSource, bool>>(containsExpression, property.Parameters);

And it works!它有效!

public static Expression<Func<T, bool>> CreateContainsExpression<T>(T obj, string[] array)
{
    var paramExpr = Expression.Parameter(typeof(T), "obj");
    var arrExpr = Expression.Constant(array);

    var colourPropExpr = Expression.Property(paramExpr, "Color");
    MethodInfo containsMethod = typeof(ICollection<string>).GetMethod("Contains");

    var containsExpr = Expression.Call(arrExpr, containsMethod, colourPropExpr);
    return Expression.Lambda<Func<T, bool>>(containsExpr, paramExpr);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM