如何过滤C#中包含另一个列表的列表?

问题描述:

我已经通过一个一对多的关系连接的两个类:如何过滤C#中包含另一个列表的列表?

public class Movie 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Synopsis { get; set; } 
    public IList<Tag> Tags { get; set; } 
} 

public class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

如何查找包含特定字符串的所有电影?我管理,只要我不潜入标签:

var result = movies.Where(m => m.Title.Contains(searchString) | 
           m.Synopsis.Contains(searchString)); 

下面是一些伪代码,只有在梦里工作:

var result = movies.Where(m => m.Title.Contains(searchString) | 
           m.Synopsis.Contains(searchString) | 
           m.Tags.Name.Contains(searchString)); 
           // Cannot access Name property of Tags like this 

什么是做正确的方式?

您无法访问Tag的属性,因为您没有对Tag的引用,而是对标记集合的引用。因此,您需要使用linq的.Any来查询:

确定序列的任何元素是否满足条件。

所以:

var result = movies.Where(m => m.Title.Contains(searchString) | 
           m.Synopsis.Contains(searchString) | 
           m.Tags.Any(t => t.Name.Contains(searchString))); 

还要考虑使用的|| operator代替| operator。两者都执行合乎逻辑的OR,但前者会懒散地做到这一点(即,一旦进入true就停下来)。了解更多:C# 'or' operator?