C# 如何为可以为三个连接参数筛选的表创建WHERE子句?

C# 如何为可以为三个连接参数筛选的表创建WHERE子句?,c#,mysql,vb.net,C#,Mysql,Vb.net,我在MySQL DB中有一个表,其结构如下: ID |产品|价格|商店| POS |卖家 我需要做一个函数,允许从我的前端按商店、POS和卖家过滤mysql表 每个POS机都属于一个商店,每个卖家都属于一个POS机 在我的前端,我有一个三视图,显示商店>POS>卖家,每个都可以检查或取消检查,然后我将检查的数据发送到后端 在这里,我要创建一个WHERE子句,比如0,1,0,0,1,1中的WHERE SHOP\u TB、POS\u TB、SELLER\u TB 它将从POS 0以及卖家0和卖家1中

我在MySQL DB中有一个表,其结构如下:

ID |产品|价格|商店| POS |卖家

我需要做一个函数,允许从我的前端按商店、POS和卖家过滤mysql表

每个POS机都属于一个商店,每个卖家都属于一个POS机

在我的前端,我有一个三视图,显示商店>POS>卖家,每个都可以检查或取消检查,然后我将检查的数据发送到后端

在这里,我要创建一个WHERE子句,比如0,1,0,0,1,1中的WHERE SHOP\u TB、POS\u TB、SELLER\u TB

它将从POS 0以及卖家0和卖家1中选择店铺0中的数据

问题是,一些POS机不能有卖家,所以我必须从中选择全部数据

我怎样才能做到这一点

这是一个很好的练习吗?例如,非常小的真实数据最多可以有20家店铺,其中最多有10家POS,最多有30家卖家,因此WHERE将变得非常大

我现在的代码如下所示:

Public Shared Function QueryParametri(configs As List(Of ModelConfig), table As String) As String
    If configs.Count > 0 Then
        Dim WhereOperatori As String = "(NPV_" & table & ", NCASSA_" & table & "" & ", OPERATORE_" & table & ") IN ("
        Dim WhereINOperatori As String = ""
        Dim WhereCasse As String = "(NPV_" & table & ", NCASSA_" & table & ") IN ("
        Dim WhereINCasse As String = ""
        For Each config As ModelConfig In configs
            For Each cassa As ListCasse In config.casse
                If cassa.operatori.Count > 0 Then
                    For Each operatore As ListOperatori In cassa.operatori
                        WhereINOperatori &= "(" & config.NPV & ", " & cassa.CS & ", " & operatore.OP & "), "
                    Next
                Else
                    WhereINCasse &= "(" & config.NPV & ", " & cassa.CS & "), "
                End If
            Next
        Next
        WhereINOperatori = Mid(WhereINOperatori, 1, WhereINOperatori.Length - 2)
        WhereOperatori = WhereOperatori & WhereINOperatori & ")"
        If (WhereINCasse IsNot "") Then
            WhereINCasse = Mid(WhereINCasse, 1, WhereINCasse.Length - 2)
            WhereCasse = WhereCasse & WhereINCasse & ")"
            WhereOperatori &= " AND " & WhereCasse
        End If
        Return WhereOperatori
    End If

    Return ""
End Function
但是它失败了,因为查询需要商店、POS机和卖家,但是如果POS机没有卖家,查询将失败

我接受c语言的解决方案,因为我对它没有问题

编辑:

我修改了代码,把WHERE分为有卖家的和没有卖家的

在哪里变成:

WHERE (NPV_SC, NCASSA_SC, OPERATORE_SC) IN ((0, 1, 0), (0, 1, 1), (0, 1, 3), (0, 1, 4), (0, 1, 6), (0, 1, 7), (0, 1, 8), (0, 1, 9), (0, 1, 10), (0, 1, 11), (0, 1, 12), (0, 1, 13), (0, 1, 14), (0, 1, 15), (0, 1, 16), (0, 1, 21), (0, 1, 23), (0, 1, 25), (0, 1, 27), (0, 1, 30), (0, 1, 108), (0, 1, 110), (0, 1, 111), (0, 1, 999), (0, 1, 1), (0, 1, 2), (0, 5, 0), (0, 5, 1), (0, 5, 3), (0, 5, 4), (0, 5, 6), (0, 5, 7), (0, 5, 8), (0, 5, 9), (0, 5, 10), (0, 5, 11), (0, 5, 12), (0, 5, 13), (0, 5, 14), (0, 5, 15), (0, 5, 16), (0, 5, 21), (0, 5, 23), (0, 5, 25), (0, 5, 27), (0, 5, 30), (0, 5, 108), (0, 5, 110), (0, 5, 111), (0, 5, 999), (0, 5, 1), (0, 5, 2), (4, 1, 0), (4, 1, 1), (4, 1, 12), (4, 1, 22), (4, 1, 23), (10, 1, 0), (10, 1, 1), (10, 1, 2), (10, 1, 5), (10, 1, 10), (10, 1, 11)) AND (NPV_SC, NCASSA_SC) IN ((1, 1))
但问题是,原因是NPV_SC,NCASSA_SC在1,1中没有显示任何数据,而如果我删除它,我将能够看到我的数据,但我需要查询的这一部分,因为它必须返回没有卖家的1号店1号POS 1的所有数据

用户界面:


这是侧边栏,而在主屏幕上,我有不同的数据,如已售出物品和其他物品的统计数据。

考虑为此使用一些ORM。创建SQL命令时,可能会发生SQL注入攻击,如this@TomasChabada我会,但我不能,因为该代码还用于商店/POS过滤,我需要添加卖家代码,老板说,过滤必须尽快进行,而不会浪费更多的时间在ITI上,如果您想构建WHERE子句取决于提供的列的值,或者不提供,那么就使用WHERE 1=1作为存根,并将您的条件连接到它。例如,如果提供了列field1的筛选器值,则将条件连接到存根,其中1=1和field1={value},如果未提供筛选器值,则只需跳过添加field1条件即可。在任何情况下,您都可以获得正确的WHERE子句,即使没有提供任何筛选值。您能否显示UI的图片并更好地解释它到底在搜索什么?很难确切地理解你的想法want@CaiusJard刚刚添加了UI,它正在搜索有关商店| POS |卖家的数据,并显示有关销售和其他内容的所有统计数据,但用户可以选择仅查看商店中包含所有卖家的特定POS的数据,或仅查看属于商店POS的单个卖家的数据