我有一个网页,用户可以根据三种不同的多选项限制结果(请参阅附图)。
一点背景知识。文件有许多部门,公司和分析师分配给他们。我的EF对象具有导航属性,这意味着我不需要编写显式JOINS来获取我需要的数据。
我的问题是我无法构建LINQ查询,我需要得到我需要的结果。使用SQL会很简单,我可以很容易地使用JOINS和WHERE IN的组合('Blah','Another blah')。在我的控制器中,我有以下代码:
public JsonResult FilterResearch(FilterResearchModel filterResearch)
{
var db = new Context();
// home model
var model = new HomeModel();
var selectedSectors = from s in db.Sectors
where filterResearch.SelectedSectors.Contains(s.Name)
select s;
var selectedCompanies = from c in db.Companies
where filterResearch.SelectedCompanies.Contains(c.Name)
select c;
var selectedAnalysts = from a in db.Analysts
where filterResearch.SelectedAnalysts.Contains(a.Name)
select a;
var filteredResults = from d in db.Documents
where selectedSectors.Contains(d.Sectors)
select d;
FilterResearch.Selected“Something”是字符串数组。我的“filteredResults”查询应该包含我打算返回的过滤文档。
修改 有些人评论说我不清楚。我正在尝试根据3个字符串数组过滤我的文档。这些字符串数组中的每一个都是“document”对象中的导航属性。在客户端上,用户有三个多选控件,因此每个数组可以有多个元素。现在,他们可以选择三种中的任何一种,并根据需要选择尽可能多的选项。
这就是问题当我编译它时,我收到以下错误:“无法从'System.Linq.IQueryable'转换为'System.Linq.ParallelQuery>”
再次编辑包含错误的图片。它出现在“where selectedSectors.Contains(d.Sectors)”
的位置我查了一下:
运气不好。有没有办法我可以说“根据公司和部门和分析师过滤文件?答案 0 :(得分:2)
也许我误解了这个(我不知道你的完整对象模型)但是不会做以下工作......
var filteredResults = from d in db.Documents
where d.Sectors.Exists(sect => filterResearch.SelectedSectors.Contains(sect.Name))
&& d.Companies.Exists(comp => filterResearch.SelectedCompanies.Contains(comp.Name))
&& d.Analysts.Exists(anyst => filterResearch.SelectedAnalysts.Contains(anyst.Name))
select d;
编辑:要添加,我还没有在Visual Studio中尝试过,因此可能无法编译。也许你需要使用Exists
- Any
以外的函数 - 但我确信你能得到我正在思考的要点。