如果参数不为null,则有条件地添加到WHERE子句



我有一个接受3个参数的存储过程,有人能告诉我,如果参数不为null,有条件地添加到where子句中最有效的方法是什么吗?

目前我有:

where ([LoggedIn] >= @dateFrom and [LoggedIn] <= @dateTo)

如果参数@email不为空,我想添加到这个中,所以有条件地执行以下

AND [Email] = @email

提前谢谢,我希望这是有意义的

没有理由不能在代码中动态构建一个包含参数的SQL,并在扩展SQL文本时为参数动态添加值。。它看起来像:

var sql = "SELECT * FROM Table WHERE ([LoggedIn] >= @dateFrom and [LoggedIn] <= @dateTo)";
var cmd = new SqlCommand(sql, connection);
cmd.Parameters.Add("@dateFrom", SqlDbType.DateTime).Value = dateFrom;
cmd.Parameters.Add("@dateTo", SqlDbType.DateTime).Value = dateTo;

if(email != null){
cmd.CommandText += " AND [Email] = @email";
cmd.Parameters.Add("@email", SqlDbType.VarChar, SIZE_OF_DB_COLUMN_HERE).Value = email;
}

当然,您应该选择SqlDbType来匹配DB中的实际内容。如果它是datetime2(7),那么它就有点冗长;

cmd.Parameters.Add(new SqlParameter("@paramName", SqlDbType.DateTime2) { Scale = 7, Value = someVariable });

如果您使用Dapper进行数据库访问,只需以类似的方式扩展SQL文本和参数集合

var sql = "SELECT * FROM Table WHERE ([LoggedIn] >= @dateFrom and [LoggedIn] <= @dateTo)";
var d = new Dictionary<string, object>(){
{ "@dateFrom", dateFrom },
[ "@dateTo", dateTo }
};
if(email != null){
sql += " AND [Email] = @email";
d["@email"] = email;
}
var r = conn.Query<TypeOfObjectHere>(sql, d);

如果你用EF做这件事,你可以利用这样一个事实,即你可以多次调用Where,它的工作原理类似于and:

var q = context.Logins.Where(l =~> l.LoggedIn >= dateFrom && l.LoggedIn <= dateTo);
if(email != null)
q = q.Where(l => l.Email == email);
var result = q.ToList();

最新更新