我有一些像这样的变量
string cond;
if(cond1){
cond += "name=@name";
}
if(cond2){
cond += "age=@age";
}
if(cond3){
cond += "city=@city";
}
query="select * from students where"+string.Join(" and ",cond);
我想这样做
query="select * from students where if exists cond1 (cond) and if exists cond2 (cond)";
我希望用cond(和)将所有conds内含到一个变量中。
答案 0 :(得分:2)
首先,要回答你的问题,你可以做这样的事情来建立你的条款:
List<string> conditions = new List<String>();
if (cond1) {
conditions.Add("name=@name");
}
if (cond2) { /* etc.. */ }
string query = "select * from students";
if (conditions.Any()) {
query += " where " + string.Join(" AND ", conditions);
}
虽然使用Linq,您可以动态构建查询并保护自己免受sql注入。
IQueryable<Student> students = myDataContext.Students; //eg DbSet<Students>
if (cond1) {
students = students.Where(s => s.Name == "Adam");
}
if (cond2) {
students = students.Where(s => s.Age > 20);
}
var matchedStudents = students.ToList();
当你调用.ToList()时,你将迭代IQueryable,结果sql查询将包含所有相关的WHERE
子句。
答案 1 :(得分:1)
string cond;
if(cond1){
cond += "name=@name";
}
if(cond2){
cond += "age=@age";
}
if(cond3){
cond += "city=@city";
}
这将为您提供类似name=@nameage=@agecity=@city
的字符串,因为您只是附加字符串。
如果您想使用String.Join()
运算符,则需要将单个部分推送到List<String>
,如下所示:
List<string> cond = new List<string>();
if(cond1){
cond.add("name=@name");
}
if(cond2){
cond.add("age=@age");
}
if(cond3){
cond.add("city=@city");
}
query="select * from students where"+string.Join(" AND ",cond.ToArray());
将导致
"select * from students where name=@name AND age=@age AND city=@city"
答案 2 :(得分:0)
你可以这样做:
List<string> conds = new List<string>();
if(cond1){
conds.Add("name=@name");
}
if(cond2){
conds.Add("age=@age");
}
if(cond3){
conds.Add("city=@city");
}
query="select * from students where " + string.Join(" and ", conds.ToArray());
我假设总会有至少一个条件(否则,你会得到select * from students where
- 无效的SQL语法)。
由于看起来您已经在使用参数(好!),您还可以跟踪SQL条件旁边的参数。
添加List<SqlParameter>
并随时填写:
List<SqlParameter> parameters = new List<SqlParameter>();
if (cond1) {
conds.Add("name=@name");
parameters.Add(new SqlParameter("@name") { Value = text1.Text; });
}
// etc.
// later..
cmd.Parameters.AddRange(parameters);
答案 3 :(得分:0)
如果您使用的是SQL,请使用案例陈述
SELECT CASE(@intCode)
WHEN 1 THEN 'Country_1'
WHEN 2 THEN 'Country_2'
WHEN 3 THEN 'Country_3'
WHEN 4 THEN 'Country_4'
WHEN 5 THEN 'Country_5'
WHEN 6 THEN 'Country_6'
WHEN 7 THEN 'Country_7'
WHEN 8 THEN 'Country_8'
WHEN 9 THEN 'Country_9'
WHEN 10 THEN 'Country_10'
ELSE 'Unknown' END