C# 如何表达所有与表达式树有关的内容
对于给定的搜索标记过滤器,预期结果是一个表达式,表示给定标记ID列表中具有所有标记的实体 Lambda可以表示为:C# 如何表达所有与表达式树有关的内容,c#,linq,expression-trees,C#,Linq,Expression Trees,对于给定的搜索标记过滤器,预期结果是一个表达式,表示给定标记ID列表中具有所有标记的实体 Lambda可以表示为: class Tag { public long TagId { get; set; } } class Taggable { ICollection<Tag> Tags { get; set; } } ... IEnumerable<long> searchTags = new List<long>() { 1, 2, 3
class Tag
{
public long TagId { get; set; }
}
class Taggable
{
ICollection<Tag> Tags { get; set; }
}
...
IEnumerable<long> searchTags = new List<long>() { 1, 2, 3 };
Func<Taggable, bool> filter = taggable => searchTags.All(qtag => taggable.Tags.Any(tag => tag.TagId == qtag));
类型“System.Linq.Enumerable”上的泛型方法“All”不兼容
使用提供的类型参数和参数。没有类型参数
如果方法是非泛型的,则应提供
它被认为是可枚举的。searchTagsConstant
和anyCall
应该满足所有的
t被认为是可枚举的。searchTagsConstant
和anyCall
没有anyCall
不是lambda表达式(Func
),只是此类表达式的潜在主体
让我们从你的目标开始:
IEnumerable<long> searchTags = new List<long>() { 1, 2, 3 };
Expression<Func<Taggable, bool>> lambda =
taggable => searchTags.All(searchTag => taggable.Tags.Any(tag => tag.TagId == searchTag));
t被认为是可枚举的。searchTagsConstant
和anyCall
没有anyCall
不是lambda表达式(Func
),只是此类表达式的潜在主体
让我们从你的目标开始:
IEnumerable<long> searchTags = new List<long>() { 1, 2, 3 };
Expression<Func<Taggable, bool>> lambda =
taggable => searchTags.All(searchTag => taggable.Tags.Any(tag => tag.TagId == searchTag));
看看这里的答案,你能修改你的代码示例来定义你的行
Expression.Property(taggable,“Tags”)中的taggable
是什么吗代码>?@请确保答案仅适用于任何
。问题是关于一个All和Any。两者都是静态扩展。这种方法应该对双方都有效。看看这里的答案,你能修改你的代码示例来定义你的行Expression.Property(taggable,“Tags”)中的taggable
是什么吗代码>?@请确保答案仅适用于任何
。问题是关于一个All和Any。两者都是静态扩展。这种方法应该对两者都有效
var taggable = Expression.Parameter(typeof(Taggable), "taggable");
var tag = Expression.Parameter(typeof(Tag), "tag");
var searchTag = Expression.Parameter(typeof(long), "searchTag");
// tag.TagId == searchTag
var anyCondition = Expression.Equal(
Expression.Property(tag, "TagId"),
searchTag);
// taggable.Tags.Any(tag => tag.TagId == searchTag)
var anyCall = Expression.Call(
typeof(Enumerable), nameof(Enumerable.Any), new[] { typeof(Tag) },
Expression.Property(taggable, "Tags"), Expression.Lambda(anyCondition, tag));
// searchTags.All(searchTag => taggable.Tags.Any(tag => tag.TagId == searchTag))
var allCall = Expression.Call(
typeof(Enumerable), nameof(Enumerable.All), new[] { typeof(long) },
Expression.Constant(searchTags), Expression.Lambda(anyCall, searchTag));
// taggable => searchTags.All(searchTag => taggable.Tags.Any(tag => tag.TagId == searchTag))
var lambda = Expression.Lambda(allCall, taggable);