仅当存在外部条件时Linq to SQL才执行where子句(如果variable = x)

时间:2018-01-19 18:18:27

标签: c# linq linq-to-sql

我提取了每个已完成X个表单的候选人列表。在启动报告时,报告管理员可以选择要报告的特定表单,或将该字段留空以获取所有表单。

以下是我的代码示例:

var candidates = from candidate in BPData.Candidates
                    join programGroup in BPData.ProgramGroups on candidate.GroupID equals programGroup.GroupID
                    where candidate.GroupID == programGroupID
                    from u in BPData.Users.Where(u => u.UserID == candidate.UserID).DefaultIfEmpty()
                    let formEntries = from formReport in BPData.FormReports
                                    where formReport.CandidateID == candidate.CandidateID
                                    where (from form in forms
                                            select form.FormID).Contains(formReport.FormID)
                                    join actionFormEntry in BPData.ActionFormEntries on formReport.ReportKey equals actionFormEntry.ValidationKey
                                    orderby formReport.FormID
                                    select new FormEntryViewModel
                                    {
                                        ... removed for brevity
                                    }
                    select new CandidateFormEntriesViewModel
                    {
                        CandidateID = candidate.CandidateID,
                        CandidateName = candidate.Name,
                        FormEntries = (List<FormEntryViewModel>)formEntries
                    };

以下代码行:

where (from form in forms select form.FormID).Contains(formReport.FormID)

如果报表管理员选择要报告的特定表单,则效果很好。但是,如果他们将这个领域留空,那么这项工作就无法进行。它应该以各种形式回归,但显然不会因为我设定条件的方式而获胜。

我的问题:
是否有可能在where子句上做某种形式的条件来满足这个要求(注意 - 这只是我的粗略思考):

where (forms.Count() > 0) ? **keep the same code as my query above** : true  

这种方法确实有效。如果forms.Count()== 0,它会提取所有表单,而当forms.Count()&gt;时,它只提取特定的表单。这是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

我会说使用逻辑或非三元,因为这是一个你不关心将结果合并到查询的其余部分的地方,那种情况是当条件linq变得复杂时。

where (forms.Count() == 0 || **keep the same code as my query above**)

答案 1 :(得分:0)

这个怎么样?

where (from form in forms select form.FormID).Count==0 or (from form in forms select form.FormID).Contains(formReport.FormID)