C# 使用多个筛选器筛选sql server表行

C# 使用多个筛选器筛选sql server表行,c#,jquery,asp.net,sql-server,tsql,C#,Jquery,Asp.net,Sql Server,Tsql,我有一个名为Student的表,其中包含许多外键,这些外键将在筛选学生(表行)之后使用 此表的结构如下所示: StudentId GenderId DegreeId NatioanlityId 1 2 2 3 .... 由于学生可以说一种或多种语言,Sudent表链接到语言表,如下所示 StudentId LangaugeId 1 1

我有一个名为Student的表,其中包含许多外键,这些外键将在筛选学生(表行)之后使用

此表的结构如下所示:

  StudentId   GenderId  DegreeId   NatioanlityId
       1            2          2           3
       ....
由于学生可以说一种或多种语言,Sudent表链接到语言表,如下所示

      StudentId LangaugeId
        1         1
        1         2
        1         3
学生可以选择一个或多个科目进行考试:

      StudentId      ExamId
       1              1
       1              2
       .... 
在我的asp.net页面中,我想使用ajax通过复选框筛选学生 例如,拥有1级学位的男女学生,会说1、2级语言的学生。。。我使用用户定义的表过滤存储过程中的行,并且我必须使用很多类似这样的IF语句 如果(存在(从@GenderTable中选择GenderId))

如何避免所有IF语句?我有5个以上的过滤器,很无聊。有人有什么想法吗


提前感谢。

我假设您的查询返回符合条件的学生列表?如果是这样,一种方法就是按照这种格式构建where子句

Where 
    (@Param1 IS NULL OR Field1 = @Param1)
    AND (@Param2 IS NULL OR Field2 = @Param2)
这可能会变得很难看,并且可能不会很好地执行,这取决于可能使用的过滤器数量和索引的构建方式

另一种选择是使用动态SQL。您可以在.net代码或SQL存储过程中生成它。基本上,最终的结果是:

Set @Query = /* base select statement */
If @Param1 IS NOT NULL
    Set @Query = @Query + 'AND Field1 = @Param1'
If @Param2 IS NOT NULL
    Set @Query = @Query + 'AND Field2 = @Param2'
Exec sp_executesql @Query, @ParamList, @Param1, @Param2

这可能会变得更难读取和调试,但它通常会执行得更好,因为您只查看实际被过滤的字段。但是,如果使用动态SQL,则需要注意一些关键点,注入攻击是最重要的。对于使用动态SQL应该做什么和不应该做什么,是一个很好的资源。

为什么您有一个“性别”的查找表?您是通过查询数据库生成复选框选项,还是在页面上硬连线?此外,对于该语言,您似乎希望能够检查多种语言。如果选中了多种语言,这是否意味着您要选择同时使用两种语言的学生?没错,Joel。学生可以通过一种或多种语言进行筛选。问题是可能没有性别检查:例如,只按语言进行筛选,如果选中了性别,则选中了学位,则将存储过程中的筛选与联接结合起来。。。你明白了吗?@Joel:通过查询DB。实际上,过滤器是用来获取与我的过滤器匹配的学生数量。让我想想这个。在我几年前参与的一个项目中,我们遇到了类似的SQL过滤问题,但您的问题要复杂一些。(我们必须处理多个过滤器,其中一些过滤器中可能没有检查项目。但我认为我们不能在给定的过滤器中检查多个项目。)这是一个良好的开端,但它不能处理多值过滤器。例如,考虑一个只有一个过滤器的情况,只选择那些会说英语和西班牙语的学生。对于一个特定的学生来说,没有一个领域可以用来确定他/她是否会说两种语言。没错,我忽略了这一点。我以前处理这个需求的方法是在.net中构建一个删除的字符串,通过SQL中的拆分函数运行它,然后使用“内部联接”或“in”准则填充匹配的行。如果您的目标是找到拥有所有选中项而不是任何选中项但仍然可行的人,则获取tricker。@Joel如果选择了多个语言,我可以使用用户定义的表类型。谢谢Rozwel。使用动态sql的解决方案适合我的情况
Set @Query = /* base select statement */
If @Param1 IS NOT NULL
    Set @Query = @Query + 'AND Field1 = @Param1'
If @Param2 IS NOT NULL
    Set @Query = @Query + 'AND Field2 = @Param2'
Exec sp_executesql @Query, @ParamList, @Param1, @Param2