我有一个表单,其目的是在两个表之间创建多对多记录(在链接表中)。 (左边的导师会议,右边的学生。会话中可能有多个学生,因此需要链接表。)这实际上工作得很好。但是,学生表基于一个只返回某些记录的查询。 (与Totor相关的学生。)但是,在某些情况下,我需要更改该查询以恢复所有学生。
所以我需要的是勾选一个复选框。当用户选中该框时,它会带回所有学生,如果不是,则会带回通常的记录。
所以问题是,如何在运行时换出查询?
答案 0 :(得分:1)
MattThalman基本上是正确的。但LightSwitch中的查询设计师并没有真正能够轻松完成他所描述的内容。滤波器部分不具备将Where短路的能力。因此,您需要编写一些代码来实现他所描述的内容。
您需要两个参数,布尔值GetAllStudents
和Tutor
。它们可以是可选的,也可以不是,这取决于您。但如果它们是可选的,则需要进行null
检查。然后单击“编写代码”并选择查询的_PreprocessQuery
方法。
在_PreprocessQuery
中,检查您的布尔值,如果您不想要所有学生,请仅使用LINQ执行过滤查询。否则,让PreprocessQuery
失败,您将获得所有记录。
代码看起来像这样:
<强> VB.NET 强>
Private Sub StudentsInSession_PreprocessQuery(ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.Student))
'If GetAllStudents is not null or false, return students assigned to Tutor
If ((GetAllStudents IsNot Nothing) AndAlso (GetAllStudents <> True)) Then
query = From sis In query
Where sis.Tutor = Tutor
Select sis
End If
End Sub
<强> C#强>
partial void EmployeeBenefitsSet_All_PreprocessQuery(ref IQueryable<Student> query) {
// If GetAllStudents is not null or false, return students assigned to Tutor
if ((GetAllStudents != null) && (GetAllStudents != true)) {
query = from sis in query
where sis.Tutor == Tutor
select sis;
}
}
请注意,我从我自己的代码中修改了这个,并使用翻译器从VB.NET转换为C#,因为你没有指定语言。您显然需要检查是否正确。
答案 1 :(得分:0)
我认为你不需要动态交换查询。只需设计一个查询,该查询采用一个布尔参数来指示复选框的状态,并根据该参数的值适当地返回数据。因此,为了便于说明,下面是这种查询的where条件的一些伪代码:(@ GetAllStudents或Student.Tutor == @Tutor)。在这种情况下,@ Tutor参数需要标记为可选。