Kombinerad kolumn i dataset och spara i cacheminne

Har en rutin som hämtar ut olika märken för en e-handelsida. Dessa visas i en DropDownList och fylldes den av en SqlDataReader.

Nu ville jag spara dessa data i ett DataSet och lagra det i Cache-minnet för att spara på dyrbara återtrippar till databasen (SQL Server).

Efter märkena i listan skulle det stå hur många produkter som finns under varje märke, inom paranteser. Därför behövde jag göra en ny kolumn och sätta ihop två värden och lägga till egna tecken.

Inlägget "SubString in an ADO.NET DataSet - (DataColumn Expression)" på CodeBetter.com visar hur man gör en nya kolumn med en SubString och som lägger till tre prickar efteråt.

ds.Tables["Customers"].Columns.Add("ShortCompanyName", typeof(string),"Substring(CompanyName, 1, 10) + '...'");

Med hjälp av började jag förstå hur syntaxen för hur DataColumn.Expression fungerar.

Här är själva kodsnutten som kombinerar två värden och skriver det sista inom paranteser.

dataSet.Tables["ChooseBrand"].Columns.Add("BrandWithCount", typeof(string), "Brand + ' (' + CountOfProducts + ')'");

Här är större del av koden som även visar hur man lägger in ett DataSet i Cache.

private void BindBrand()
{

ddlBrand.Items.Clear();

DataSet ds = LoadBrand();

ddlBrand.DataSource = ds;
ddlBrand.DataSource = ds.Tables[0];
ddlBrand.DataTextField = ds.Tables[0].Columns["BrandWithCount"].ColumnName.ToString();

ddlBrand.DataValueField = ds.Tables[0].Columns["Id"].ColumnName.ToString();
ddlBrand.DataBind();

ListItem titleItem = new ListItem((string)this.GetLocalResourceObject("ChooseBrand"), "0");
ddlBrand.Items.Insert(0,titleItem);

}

protected DataSet LoadBrand()
{
Trace.Write("LoadBrand()");
DataSet dataSet = new DataSet();

string strCacheName = "ChooseBrand";
//Cache.Remove(strCacheName);

//Hämta cachad data om det finns
if (Cache[strCacheName] != null)
{
dataSet = (DataSet)(Cache[strCacheName]);
Trace.Write("//Hämta cachad ChooseBrand");
}
else
{

SqlConnection conn = new SqlConnection(strConn);

string strSQL = "SELECT DISTINCT Brand.Id, Brand.Brand,(SELECT Count(Product.Id) AS CountOfProductId FROM Product WHERE Product.BrandId=Brand.Id) AS CountOfProducts FROM Brand ORDER BY Brand.Brand";

try
{
SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, conn);
dataAdapter.Fill(dataSet, "ChooseBrand");
dataAdapter.Dispose();
dataAdapter = null;


//Lägg till custom kolumn
dataSet.Tables["ChooseBrand"].Columns.Add("BrandWithCount", typeof(string), "Brand + ' (' + CountOfProducts + ')'");

Cache.Insert(strCacheName, dataSet, null, DateTime.Now.AddMinutes(21), TimeSpan.Zero);
Trace.Write("//Lägg in ChooseBrand i cachen");
}
catch (Exception objException)
{
Trace.Warn("LoadChooseBrand() Fel!", objException.Message);
}
finally
{
if (conn != null)
{
conn.Close();
conn = null;
}
}
}
return dataSet;
}