-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 を 1 つの変数にまとめたいと考えています。

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文字列を追加しているだけなので、これにより文字列が得られます。

Operatorを使用する場合は、次のよう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"
于 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());

少なくとも 1 つの条件が常に存在すると想定しています (そうでない場合は、select * from students where無効な SQL 構文が発生します)。

すでにパラメーターを使用しているように見えるので (良い!)、SQL 条件と一緒にパラメーターを追跡することもできます。

a を追加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 に答える