-2

我有一些像这样的变量

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(and) 将所有 conds 内爆到一个变量中。

4

4 回答 4

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子句。

于 2013-09-20T00:29:56.220 回答
1
string cond;

if(cond1){
    cond += "name=@name";
}

if(cond2){
    cond += "age=@age";

}

if(cond3){
    cond += "city=@city";
}

这会给你一个类似的字符串,name=@nameage=@agecity=@city因为你只是在追加字符串。

如果要使用String.Join()Operator,则需要将单个部分推送到 a 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"
于 2013-09-20T00:26:55.173 回答
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);
于 2013-09-20T00:26:38.347 回答
0

如果您使用 SQL,请使用 case 语句

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 
于 2013-09-20T03:16:38.280 回答