IEnumerable <int> .contains(MemberExpression)的动态Linq表达式

The*_*erd 6 c# linq linq-expressions

我想使用Linq Expression树创建一个表达式来模拟这个:

List<int> ids = new List<int>();

// Fill ids with data

db.Where(a => ids.Contains(a.Id));
Run Code Online (Sandbox Code Playgroud)

这是我得到的地方,但我仍然遗漏了一些东西:

MemberExpression me = Expression.Property(pe, typeof(T).GetProperty(property));

Expression callContains = Expression.Call(typeof(System.Linq.Enumerable), "Contains", new Type[] { me.Type }, me);
Run Code Online (Sandbox Code Playgroud)

我怎样才能做我想做的事呢?

p.s*_*w.g 12

因为Contains是一种扩展方法,所以您还必须将ids集合作为参数提供,在本例中为ConstantExpression.

您的实现可能略有不同,但看起来有点像这样:

public static IQueryable<T> DynamicContains<T, TProperty>(
    this IQueryable<T> query, 
    string property, 
    IEnumerable<TProperty> items)
{
    var pe = Expression.Parameter(typeof(T));
    var me = Expression.Property(pe, property);
    var ce = Expression.Constant(items); 
    var call = Expression.Call(typeof(Enumerable), "Contains", new[] { me.Type }, ce, me);
    var lambda = Expression.Lambda<Func<T, bool>>(call, pe);
    return query.Where(lambda);
}

db.DynamicContains("Id", ids);
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`Expression.Property`的[this overload](http://msdn.microsoft.com/en-us/library/bb341554.aspx)使你的第二行只是`var me = Expression.Property (pe,property);`? (2认同)