Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 使用Linq查询多个字段的集合_C#_Linq_Asp.net Core - Fatal编程技术网

C# 使用Linq查询多个字段的集合

C# 使用Linq查询多个字段的集合,c#,linq,asp.net-core,C#,Linq,Asp.net Core,我有一个IEnumerable对象,我想在IEnumerable的多个字段中搜索单个搜索项,包括相关的数据标记 视频、视频标签和标签对象如下所示 public class Video { public Guid Id {get; set;} public string Name {get; set;} public string Description {get; set; } public ICollection<VideoTags> VideoTags {

我有一个IEnumerable对象,我想在IEnumerable的多个字段中搜索单个搜索项,包括相关的数据标记

视频、视频标签和标签对象如下所示

public class Video
{
   public Guid Id {get; set;}
   public string Name {get; set;}
   public string Description {get; set; }
   public ICollection<VideoTags> VideoTags {get; set;}
}

public class VideoTags
{
   public Guid VideoId {get; set; }
   public Video Video {get; set; }

   public Guid TagId{get; set;}
   public Tag Tag {get; set; }
}

public class Tag
{
   public Guid Id {get; set; }
   public string TagName {get; set;}
}
如何实现这一点?

添加Select子句以返回元组。另外,Any用于验证视频标记是否包含标记名的搜索词

videos = videos.Where(v => v.Name.Contains(searchTerm) ||
                v.Description.Contains(searchTerm) ||
                v.VideoTags.Any(t => t.Tag.TagName.Contains(searchTerm)))
                .Select(v => new Tuple<string, string, string>(v.Name, v.Description, v.VideoTags.FirstOrDefault(t => t.Tag.TagName.Contains(searchTerm))));

VideoTags不是集合,因此您可以通过直接访问属性来检查标记名中的搜索项。

是否有任何错误?运算符| |不能应用于bool类型的操作数,IEnumerabley您应该包括VideoTags。我已经包括在内。不包括?在选择它时会引发异常。不过,对于您的响应,VideoTags是一个ICollection。我已经用它更新了我的帖子。@CMorgan-我已经更新了答案,将视频标签作为收藏。Any用于检查条件,FirstOrDefault用于获取第一个值。
videos = videos.Where(v => v.Name.Contains(searchTerm) ||
                v.Description.Contains(searchTerm) ||
                v.VideoTags.Any(t => t.Tag.TagName.Contains(searchTerm)))
                .Select(v => new Tuple<string, string, string>(v.Name, v.Description, v.VideoTags.FirstOrDefault(t => t.Tag.TagName.Contains(searchTerm))));