这曾经为我工作然后失败了。我想只返回包含所有过滤器的项目,而不是至少一个现在正在执行的过滤器。这里有什么不对?
private IQueryable<IndexItem> FilteredIndex (IQueryable<IndexItem> index, IEnumerable<string> filters)
{
var filteredIndex= from f in filters.AsQueryable()
where f.Length>0
from i in index
where i.FilterNames.Contains(f)
select i;
return filteredIndex;
}
答案 0 :(得分:3)
直接向前。对于索引检查中的给定项目,对于给定项目包含过滤器的所有过滤器都是如此。只需选择索引中的所有项目,即给定条件为真。
index.Where(item =>
filters.All(filter => item.FilterNames.Contains(filter)))
我不确定是否需要检查长度是否大于零,坚固它很容易集成。
index.Where(item =>
filters.All(filter =>
(filter.Length > 0 ) || (item.FilterNames.Contains(filter))))
它适用于LINQ to Objects,我猜它会做你想要的,但我不确定它是否适用于LINQ to SQL。
答案 1 :(得分:1)
如下:
foreach(string s in filters) {
if(s.Length == 0) continue;
string tmp = s; // because of "capture" problem
index = index.Where(i => i.FilterNames.Contains(tmp));
}
return index;
这适用于一系列Where
条款,涵盖所有过滤条件 - 基本上是AND
。
答案 2 :(得分:1)
转过身来。你想要的是索引中的那些项目,其中FilterNames中的每个项目都在过滤器中有相应的条目。我不确定它的表现如何,但计数比较应该如此。类似的东西:
private IQueryable<IndexItem> FilteredIndex(IQueryable<IndexItem> index, IEnumerable<string> filter)
{
var filteredIndex = from i in index
where (from s in i.FilterNames
where filter.Contains(s)
select s).Count() == i.FilterNames.Count
select i;
return filteredIndex;
}