在C#中破坏一些变量

时间:2013-09-20 00:06:09

标签: c# sql sql-server

我有一些像这样的变量

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内含到一个变量中。

4 个答案:

答案 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