Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何表达所有与表达式树有关的内容_C#_Linq_Expression Trees - Fatal编程技术网

C# 如何表达所有与表达式树有关的内容

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

对于给定的搜索标记过滤器,预期结果是一个表达式,表示给定标记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 };
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);