c# - 在 C# 中根据用户输入条件编写动态 sql 查询

标签 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);

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

在前端,用户可以选择种姓、资格、肤色,我必须根据这些条件设计查询。用户可以为这些属性中的任何一个选择多个值。现在根据这些用户条件,我必须在 C# 中设计 sql 查询。

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

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

假设用户选择 qualification 作为 BACHELOR,COMPLEXION 选择 FAIR, BLACK 那么查询将是:

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

所以查询是动态的,基于三个属性。对于这种情况,我如何在 C# 中编写动态查询?

最佳答案

实际上有 100 多种方法可以做到这一点。

在过去,我们只会使用 if 语句和 StringBuilder。这些天ORMsEntity Framework 是常用的,并且非常成功地解决了这样的问题。

但是,如果您不想启动自己的查询,或者不想使用像Entity Framework 这样的 ORM,我会建议您使用查询生成器。这些又是一毛钱一打,而且有数百个。快速网络搜索发现 https://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}");
}

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

就我个人而言,我建议直接跳入深端并使用 Entity Framework 并完成它。但是,这个示例可能会让您指向正确的方向。

关于c# - 在 C# 中根据用户输入条件编写动态 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232076/

相关文章:

c# - 包括具有序列化形式的数组 - jquery

mysql - 根据值在一行中选择不同的列

mysql - 使用参数值作为参数名称的 SQL 注入(inject)

sql - 如何在Oracle 10g中执行 "selective where"?

c# - 如何使用linq将excel文件上传到数据库?

sql - T-SQL,使用参数与前导数字的字符串比较返回误报

c# - Linq 查询中 OrderBy、Where、Select 的排序

c# - 是否可以只为 List<T> 编写扩展方法,其中 T 是从类 K 继承的类

c# - c# 中的 Double.PositiveInfinity 返回 ∞;有没有显示 "Infinity"的方法?

mysql - 从 MS SQL 2014 到 MySQL 的数据库架构转换