1

これが私の問題の内訳です:

方法があります。引数は整数のリストです。その行のIDが引数リストの整数の1つと等しいすべての行で特定の値を返す、最適化されたSQLクエリを作成したいと思います。シンプルでしょ?

必要以上に難しくしたような気がします:

private List<string> ReturnValue(List<int> ids)
        {
            List<string> ValuesIWantToReturn = new List<string>();
            StringBuilder sb = new StringBuilder("SELECT ValueIWantToReturnfrom table WHERE ");
            foreach (int id in ids)
            {
                sb.Append( string.Format("ID = {0} OR ", id) );
            }
            sb.Remove(sb.Length - 3, 3); //remove trailing "OR"
                           sb.Append(";");
            SqlDataReader reader =  RunSelectQuery( sb.ToString() );
            while (reader.Read())
            {
                ValuesIWantToReturn.Add(reader.GetString(0));
            }

            return ValuesIWantToReturn;
        }

私のコードの一般的な可読性と構造に関するフィードバックもいただければ幸いです。改善するのはいつでもいいです:)

4

1 に答える 1

4

IN代わりに構文を使用できますOR

 WHERE id IN (1,2,3,4)

IDのリストをテーブル値パラメーターとしてストアドプロシージャに渡し、それをテーブルに結合する方が効率的かもしれませんが、数値のリストの長さによっては、ソリューションの設計が過剰になる可能性があります。

ループの代わりに、string.Joinリストの作成に使用できます

string query = "SELECT ValueIWantToReturn from table WHERE ID IN ("
    + string.Join(",", ids)
    + ")";

(リストには常に少なくとも1つの番号があると仮定します)

于 2012-07-27T14:00:36.660 に答える