基于C#中的用户输入编码编写动态sql查询

nis*_*inn 6 c# sql sql-server

CREATE TABLE [DBO].[TBL_PROFILE] 
(
    PROFILE_ID BIGINT IDENTITY(1, 1) NOT NULL
    ,NAME NVARCHAR(200) NOT NULL
    ,GENDER TINYINT NOT NULL
    ,CASTE NVARCHAR(15)
    ,QUALIFICATION NVARCHAR(50)
    ,COMPLEXION NVARCHAR(50)
    ,FEEDING_HBTS INT 
    ,CONSTRAINT PK__PROFILE PRIMARY KEY (PROFILE_ID)
)

INSERT INTO [DBO].[TBL_PROFILE] 
VALUES ('AJAY', 1, 'BRAHMAN', 'MASTER', 'FAIR', 1),
       ('JIRAM', 1, 'CHETTRI', 'BACHELOR', 'BLACK', 1),
       ('SUMAN', 1, 'NEWAR', '+2', 'BLACK', 1),
       ('HIRA', 1, 'MAGAR', 'BACHELOR', 'FAIR', 1),
       ('JANNY', 1, 'MAGAR', 'BACHELOR', 'MEDIUM', 1),
       ('RANVI', 1, 'NEWAR', 'BACHELOR', 'BLACK', 1),
       ('SURAJ', 1, 'BRAHMAN', 'BACHELOR', 'FAIR', 1);
Run Code Online (Sandbox Code Playgroud)

以上是SQL Server表和一些用于测试目的的示例数据.

在前端,用户可以选择种姓,资格,肤色,并根据这些条件设计查询.用户可以为任何这些属性选择多个值.现在基于这些用户条件,我将在C#中设计sql查询.

假设,用户选择NEWAR,MAGAR作为种姓,其他人为NULL,则查询将为:

SELECT * 
FROM [DBO].[TBL_PROFILE] 
WHERE GENDER = 1
  AND CASTE IN ('NEWAR', 'MAGAR')
Run Code Online (Sandbox Code Playgroud)

假设用户选择资格为BACHELOR和COMPLEXION为FAIR,BLACK则查询将为:

SELECT * 
FROM [DBO].[TBL_PROFILE] 
WHERE GENDER = 1
  AND COMPLEXION IN ('FAIR', 'BLACK') 
  AND QUALIFICATION = 'BACHELOR';
Run Code Online (Sandbox Code Playgroud)

因此,查询是动态的,基于三个属性.如何在C#中为这种情况编写动态查询?

AAA*_*ddd 4

实际上有数百种方法可以做到这一点。

在过去,我们只使用if语句和StringBuilder. 如今,诸如实体框架之类的ORM已被广泛使用,并且在解决此类问题方面非常成功。

但是,如果您不想启动自己的查询,或使用像Entity Framework这样的 ORM ,我会建议使用查询生成器。这些又是十几个,而且有数百个。快速网络搜索发现h​​ttps://sqlkata.com/docs/

  • 安装包 SqlKata
  • 安装包 SqlKata.Execution

代码

// these would come from the ui
int? gender = 1;
var complexion = new[]
                     {
                        "FAIR",
                        "BLACK"
                     };
var qualification = "BACHELOR";

// setup
var connection = new SqlConnection("...");
var compiler = new SqlServerCompiler();
var db = new QueryFactory(connection, compiler);

//query
var query = db.Query("TBL_PROFILE");

if (gender != null)
   query.Where("GENDER", gender);

if (complexion != null)
   query.WhereIn("COMPLEXION ", complexion);

if (qualification != null)
   query.Where("QUALIFICATION ", qualification);

...

var results = query.Get();

foreach (var profile in results)
{
   Console.WriteLine($"{profile.Id}: {profile.Name}");
}
Run Code Online (Sandbox Code Playgroud)

免责声明:我不认可这个查询生成器,而且我从未使用过它。您需要自行进行尽职调查并自行承担使用风险

就我个人而言,我建议直接跳入深层并使用实体框架并完成它。然而,这个例子可能会让你指明正确的方向。

  • 感谢您将 OP 引向真正的 ORM。可能还想添加一些原因(索引、参数化查询) (2认同)