【问题标题】:query collection for multiple fields with Linq使用 Linq 查询多个字段的集合
【发布时间】:2021-02-07 14:52:28
【问题描述】:

我有一个 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;}
}

如何有效地在名称、描述和标记名称字段中搜索单个搜索词,如果其中任何一个包含搜索词,然后返回List&lt;Tuple&lt;string, string, string&gt;&gt;

下面的代码不起作用

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

我怎样才能做到这一点?

【问题讨论】:

  • 你有什么错误吗?
  • 运算符 ||不能应用于 bool 和 IEnumerable 类型的操作数

标签: c# linq asp.net-core


【解决方案1】:

添加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 中的搜索词。

【讨论】:

  • 您应该包含 VideoTags。
  • 在 Select 中抛出异常。
  • 感谢您的回复,不过,VideoTags 是一个 ICollection。我已经用它更新了我的帖子。
  • 能否请您发布例外情况?
  • @CMorgan - 我已经更新了答案,将 VideoTags 作为集合包含在内。 Any 用于检查条件,FirstOrDefault 用于获取第一个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多