假设我有一个名为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'。
知道我在这个地方出错了吗?
答案 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;
如果列表包含重复项,则会重复文档。