用任何|转换lambda包含到表达式树

时间:2017-10-08 05:58:58

标签: c# expression-trees

如何使用表达式树语法表示以下简单lambda?

v.Tags.Any(t => searchTags.Contains(t.ID));

其中:

  • searchTags =长列表
  • v =带有标签导航属性的类
  • t =具有ID属性的标记类

已尝试对以下内容进行修改:

 var anyInfo = typeof(Queryable).GetMethods()
         .Where(m => m.Name == "Any")
         .Single(m => m.GetParameters().Length == 2)
         .MakeGenericMethod(typeof(Tag));


 var toQueryable = typeof(Queryable).GetMethods()
         .Where(m => m.Name == "AsQueryable")
         .Single(m => m.IsGenericMethod)
         .MakeGenericMethod(typeof(Tag));

 var containsInfo = typeof(List<long>).GetMethod("Contains", new Type[] { typeof(long) });

 var list = Expression.Constant(searchTags);
 var mcvalue = Expression.Property(v, "Tags");
 ParameterExpression tagParam = Expression.Parameter(typeof(Tag), "mt");

 var tagID = Expression.Property(tagParam, "ID");
 var st = Expression.Call(list, containsInfo, tagID);
 return Expression.Call(null, anyInfo, Expression.Call(null, toQueryable, mcvalue), st);

1 个答案:

答案 0 :(得分:2)

以下是.mat-drawer-backdrop.mat-drawer-shown { background: none; } 语句结果的C#等价物:

return

除了冗余的v.Tags.AsQueryable().Any(searchTags.Contains(t.ID)) 调用之外,主要问题是结果和AsQueryable()调用参数都不是 lambda 表达式,而是表示潜在lambda表达式的表达式。为了将它们转换为lambda表达式(并使用相关的参数表达式连接),您需要使用Expression.Lambda方法重载之一。

建立lambda表达式,如

Any

可以通过以下方式完成:

v => v.Tags.Any(t => searchTags.Contains(t.ID));