戻り値として関数にリストとして渡さないのはなぜですか(リストを返すのは好きではありません)。このようにして、データベースの値を取得した後にリストに何が起こるかを制御できます。
public void Fill()
{
List<CascadingDropDownNameValue> cities = new List<CascadingDropDownNameValue>();
FetchCities(cities, knownCategoryValues, category);
cities.Add(new CascadingDropDownNameValue("new city", "0"));
}
public void FetchCities(List<CascadingDropDownNameValue> values, string knownCategoryValues, string category)
{
string CountryCode;
StringDictionary strCountries = AjaxControlToolkit.CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
CountryCode = strCountries["Country"].ToString();
con.Open();
SqlCommand cmd = new SqlCommand("select * from Cities where Country=@Code Order by CityName ", con);
cmd.Parameters.AddWithValue("@Code", CountryCode);
cmd.ExecuteNonQuery();
SqlDataAdapter dastate = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
dastate.Fill(ds);
con.Close();
List<CascadingDropDownNameValue> states = new List<CascadingDropDownNameValue>();
foreach (DataRow dtRow in ds.Tables[0].Rows)
{
string StateID = dtRow["CityID"].ToString();
string StateName = dtRow["CityName"].ToString();
values.Add(new CascadingDropDownNameValue(StateName, StateID));
}
}
UPDATE : もう 1 つの優れたアプローチは、IEnumerable< CascadingDropDownNameValue> を返すことです。
public void Fill()
{
List<CascadingDropDownNameValue> cities = new List<CascadingDropDownNameValue>();
cities.AddRange(FetchCities(connectionString, knownCategoryValues, category));
cities.Add(new CascadingDropDownNameValue("new city", "0"));
}
public IEnumerable<CascadingDropDownNameValue> FetchCities(string connectionString, string knownCategoryValues, string category)
{
StringDictionary strCountries = AjaxControlToolkit.CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
string CountryCode = strCountries["Country"].ToString();
using (SqlConnection con = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("select * from Cities where Country=@Code Order by CityName ", con))
{
cmd.Parameters.Add("@Code", SqlDbType.VarChar).Value = CountryCode;
using (SqlDataReader reader = cmd.ExecuteReader())
while (reader.Read())
{
string StateID = reader["CityID"].ToString();
string StateName = reader["CityName"].ToString();
yield return new CascadingDropDownNameValue(StateName, StateID);
}
}
}
利点は、行をストリーミングし、必要に応じてオブジェクトに変換することです。これにより、上位 10 件のみが必要な場合に有利になります。SQL サーバーからそれ以上の行を取得することはありません。(一部の行キャッシング/ブロック読み取りを除く)
DataSet.Fill
オブジェクトを返す前にすべての行を取得します。したがって、そのテーブルに +1m 行が含まれている場合。最初に 1m 行の DataTable を作成し、次にそれらをオブジェクトで返します。
接続文字列を渡す理由は、より多くの開いているレコードセットを許可するためです。(接続ごとに 1 つの開いているレコードセット)
この場合、cities.AddRange
はすべての行を繰り返します。トップ 10 のみを追加するには、次のようにします。
var cities = FetchCities(connectionString, knownCategoryValues, category).Take(10);
cities.AddRange(cities);
幸運を。