Прямо вперед. Для данного элемента из индекса убедитесь, что для всех фильтров верно, что данный элемент содержит фильтр. При этом просто выберите все элементы из индекса, для которых данное условие истинно.
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.