首页 > 解决方案 > 使用 Linq 查询多个字段的集合

问题描述

我有一个IEnumerable<Videos>对象,我想在 IEnumerable 的多个字段中搜索单个搜索词,包括相关数据(标签)。

Video、VideoTags 和 Tag 对象如下所示

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;}
}

如果其中任何一个包含 searchTerm,我如何有效地搜索字段名称、描述和标记名称中的单个搜索词,然后返回一个List<Tuple<string, string, string>>.

下面的代码不起作用

videos = videos.Where(v => v.Name.Contains(searchTerm) ||
                v.Description.Contains(searchTerm) ||
                v.VideoTags.Where(t => t.Tag.TagName.Contains(searchTerm))

我怎样才能做到这一点?

标签: c#linqasp.net-core

解决方案


添加一个Select子句以返回Tuple. 还Any用于验证视频标签是否包含 TagName 的搜索词。

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不是一个集合,因此您可以TagName通过直接访问该属性来检查搜索词。


推荐阅读