如何使用表达式树语法表示以下简单lambda?
v.Tags.Any(t => searchTags.Contains(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);
答案 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));