LINQ检查数据库列的值是否在List <string>中

时间:2015-11-02 15:11:06

标签: c# linq

假设我有一个名为documents的表格,如下所示:

ID DocumentName Name
1 Test1.txt Alan
2 Test2.txt Alan
3 Test3.txt Jane
4 Test4.txt Alan
5 Test5.txt Bob
6 Test6.txt Bob
7 Test7.txt Jane

我希望使用LINQ进行过滤,只显示该表中的那些行,并使用列表提供的名称,例如:

List<string> names = new List<string>();
names.Add("Alan");
names.Add("Bob");

应该只显示:

ID DocumentName Name
1 Test1.txt Alan
2 Test2.txt Alan
4 Test4.txt Alan
5 Test5.txt Bob
6 Test6.txt Bob

我尝试过:

var filteredDatabase = db.document =
    .Where(a => a.Name.Intersect(names).Any());

这不起作用,错误说:

  

CS1929'string'不包含'Intersect'和。的定义   最佳扩展方法过载   'Queryable.Intersect(IQueryable,IEnumerable)'   需要一个'IQueryable'类型的接收器

我也尝试过:

var filteredDatabase = db.document =
    .Where(a => a.Name.Any(x => names.Contains(x));

这也行不通,错误说:

  

无法从'char'转换为'string'。

知道我在这个地方出错了吗?

2 个答案:

答案 0 :(得分:2)

Contains以这种方式工作

var filteredDatabase = db.document.Where(a => names.Contains(a.Name));

答案 1 :(得分:1)

您可以使用Contains

var filteredDatabase = db.document
    .Where(a => names.Contains(a.Name));

所有LINQ提供商都应该支持这一点。如果Join不包含重复项,您也可以使用List<string>。这仅适用于Linq-To-Objects:

var filteredDocuments = from doc in documents // documents is f.e. List<CustomType>
                        join name in names
                        on doc.Name equals name
                        select doc; 

如果列表包含重复项,则会重复文档。