c# - 在 C# 中基于用户输入代码编写动态 sql 查询
问题描述
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')
假设用户选择资格为 BACHELOR,COMPLEXION 选择为 FAIR, BLACK,那么查询将是:
SELECT *
FROM [DBO].[TBL_PROFILE]
WHERE GENDER = 1
AND COMPLEXION IN ('FAIR', 'BLACK')
AND QUALIFICATION = 'BACHELOR';
所以查询是动态的,基于三个属性。对于这种情况,如何在 C# 中编写动态查询?
解决方案
确实有 100 种方法可以做到这一点。
在过去,我们只会使用if
语句和StringBuilder
. 这些天来,像实体框架这样的 ORM被普遍使用,并且非常成功地解决了这样的问题。
但是,如果您不想启动自己的查询,或者不想使用像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}");
}
免责声明:我不认可此查询生成器,我从未使用过它。您需要自己进行尽职调查并自行承担使用风险。
就我个人而言,我建议只是跳入深层次并使用实体框架并完成它。但是,此示例可能会让您指出正确的方向。
推荐阅读
- python - 这里导入错误的确切原因是什么?
- python - 如何从 if 语句中创建永久更改?
- stripe-payments - Stripe - 处理来自同一 IP 的多笔付款
- angular - 如何根据Angular中的虚假值选择默认下拉选项?
- visual-studio-2017 - 指定的任务可执行位置“...\packages\Microsoft.Net.Compilers.1.3.2\build\..\tools\csc.exe”无效
- scala - 如何在 Spark 或 Scala 中检查文件是否是有效的 gz
- html - 导出到 Apps Script webapp 的图表数据为空
- teamsql - TeamSQL 可以转储到文件吗
- javascript - 元素出现但不是子元素的选择器
- android - 在 Android 上的 USB 设备之间切换音频