我有一个接受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();