如何向Form添加自定义查询

时间:2014-07-29 00:24:56

标签: visual-studio-lightswitch

我有一个表单,其目的是在两个表之间创建多对多记录(在链接表中)。 (左边的导师会议,右边的学生。会话中可能有多个学生,因此需要链接表。)这实际上工作得很好。但是,学生表基于一个只返回某些记录的查询。 (与Totor相关的学生。)但是,在某些情况下,我需要更改该查询以恢复所有学生。

所以我需要的是勾选一个复选框。当用户选中该框时,它会带回所有学生,如果不是,则会带回通常的记录。

所以问题是,如何在运行时换出查询?

2 个答案:

答案 0 :(得分:1)

MattThalman基本上是正确的。但LightSwitch中的查询设计师并没有真正能够轻松完成他所描述的内容。滤波器部分不具备将Where短路的能力。因此,您需要编写一些代码来实现他所描述的内容。

您需要两个参数,布尔值GetAllStudentsTutor。它们可以是可选的,也可以不是,这取决于您。但如果它们是可选的,则需要进行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参数需要标记为可选。