我正在与我认为简单的查询作斗争......
架构就像:
Documents
(文件ID,姓名)
Industries
(行业ID,姓名)
Documents_Industries
(DocumentID,IndustryID)
数据就像:
DocA - IndustryA
DocB - IndustryA,IndustryB
DocC - IndustryA,IndustryB
DocD - IndustryB
(因此上面的数据会导致Documents_Industries
中的6行,希望这是不言自明的
预期行为:我试图显示一个文档列表,按用户选择的行业进行过滤。如果选择了IndustryA,则结果集应为DocA,DocB,DocC。如果选择了IndustryB,则结果集应为DocB,DocC,DocD。 如果选择了IndustryA和IndustryB,结果集应为DocB,DocC。
到目前为止代码:
IEnumerable<Document> docs = db.Documents.Where(l => l.IsActive == true);
// industryIdsSelected is an int[] from the user's selection
if (industryIdsSelected.Length > 0)
{
docs = docs.Where(l => l.Industries.Any(m => industryIdsSelected.Contains(m.IndustryID)));
}
实际行为:如果选择了IndustryA和IndustryB,则结果集为DocA,DocB,DocC,DocD。而不仅仅是DocB,DocC。
我已尝试使用.All()
,但这也不起作用。我能做错什么?
答案 0 :(得分:2)
您需要同时使用All
和Any
:
docs.Where(l => industryIdsSelected.All(x => l.Industries.Any(m => m.IndustryID == x)));