I made some changes to how I was saving the data in order for it to show up on a kendo grid. Right now my giant method is getting data from the database (using getValue
), then creating a new list to save both data onto the single list to populate the kendo grid with one list even though they are two different types of data (although similar).
Here is my current code that works:
//Grabs the value of angles and points already existing in db and returns the data to the view
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult ReadMeasurements([DataSourceRequest] DataSourceRequest request, string viewType)
{
try
{
JsonResult json = new JsonResult();
List<AngleData> angledata = UserSession.GetValue(StateNameEnum.Planning, ScreenName.Planning.ToString() + "Angles" + viewType, UserSessionMode.Database) as List<AngleData> ?? new List<AngleData>();
List<PointData> pointData = UserSession.GetValue(StateNameEnum.Planning, ScreenName.Planning.ToString() + "Points" + viewType, UserSessionMode.Database) as List<PointData> ?? new List<PointData>();
List<PlanningViewParam> measurements = new List<PlanningViewParam>();
if (pointData.Count() != 0 && angledata.Count() != 0)
{
foreach (AngleData i in angledata)
{
string col = "#" + ColorTranslator.FromHtml(String.Format("#{0:X2}{1:X2}{2:X2}", (int)(i.color.r * 255), (int)(i.color.g * 255), (int)(i.color.b * 255))).Name.Remove(0, 2);
int angleVal = (int)i.angleValue;
measurements.Add(new PlanningViewParam()
{
Color = col,
Label = "Angle",
Value = angleVal,
Number = i.angleNumber,
AngleName = i.name
});
}
var numbers = new HashSet<int>();
var distinctPoints = pointData.Where(x => numbers.Add(x.pointNumber));
foreach (PointData f in distinctPoints)
{
string col = "#" + ColorTranslator.FromHtml(String.Format("#{0:X2}{1:X2}{2:X2}", (int)(f.color.r * 255), (int)(f.color.g * 255), (int)(f.color.b * 255))).Name.Remove(0, 2);
string angleValWithQ = f.pointAnglesValue;
string pointAnglesVal = "";
if (angleValWithQ != null)
{
pointAnglesVal = angleValWithQ.Replace("?", "°");
}
string pointNam = f.pointUniqueKey;
measurements.Add(new PlanningViewParam()
{
PointColor = col,
PointLabel = "Point",
PointValue = pointAnglesVal,
PointName = pointNam,
Number = f.pointNumber
});
}
return json = Json(measurements.ToDataSourceResult(request, i => new PlanningViewParam()
{
Color = i.Color,
Label = i.Label,
Value = i.Value,
PointColor = i.PointColor,
PointLabel = i.PointLabel,
PointValue = i.PointValue,
PointName = i.PointName,
AngleName = i.AngleName,
Number = i.Number
}), JsonRequestBehavior.AllowGet);
}
else if (angledata.Count() != 0)
{
foreach (AngleData i in angledata)
{
string col = "#" + ColorTranslator.FromHtml(String.Format("#{0:X2}{1:X2}{2:X2}", (int)(i.color.r * 255), (int)(i.color.g * 255), (int)(i.color.b * 255))).Name.Remove(0, 2);
int angleVal = (int)i.angleValue;
measurements.Add(new PlanningViewParam()
{
Color = col,
Label = "Angle",
Value = angleVal,
Number = i.angleNumber,
AngleName = i.name
});
}
return json = Json(measurements.ToDataSourceResult(request, i => new PlanningViewParam()
{
Color = i.Color,
Label = i.Label,
Value = i.Value,
Number = i.Number,
AngleName = i.AngleName
}), JsonRequestBehavior.AllowGet);
}
else if (pointData.Count() != 0)
{
var numbers = new HashSet<int>();
var distinctPoints = pointData.Where(x => numbers.Add(x.pointNumber));
foreach (PointData f in distinctPoints)
{
string col = "#" + ColorTranslator.FromHtml(String.Format("#{0:X2}{1:X2}{2:X2}", (int)(f.color.r * 255), (int)(f.color.g * 255), (int)(f.color.b * 255))).Name.Remove(0, 2);
string angleValWithQ = f.pointAnglesValue;
string pointAnglesVal = "";
if (angleValWithQ != null)
{
pointAnglesVal = angleValWithQ.Replace("?", "°");
}
int pointNumber = f.pointNumber;
string pointNam = f.pointUniqueKey;
measurements.Add(new PlanningViewParam()
{
PointColor = col,
PointLabel = "Point",
PointValue = pointAnglesVal,
PointName = pointNam,
Number = pointNumber
});
}
return json = Json(measurements.ToDataSourceResult(request, f => new PlanningViewParam()
{
PointColor = f.PointColor,
PointLabel = f.PointLabel,
PointValue = f.PointValue,
PointName = f.PointName,
Number = f.Number
}), JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
Log.Item(ex);
}
return null;
}
AngleData
has Color
color property which is described as:
public partial class Color
{
public float b;
public float a;
public float r;
public float g;
}
So, basically, this method works perfectly but I want to simplify it and I'm not sure how. Currently the performance of this method is ~1.05s!
ToDataSourceResult Extension methods:
public static DataSourceResult ToDataSourceResult(this DataTable dataTable, DataSourceRequest request);
public static DataSourceResult ToDataSourceResult(this IEnumerable enumerable, DataSourceRequest request);
public static DataSourceResult ToDataSourceResult(this IQueryable enumerable, DataSourceRequest request);
public static DataSourceResult ToDataSourceResult<TModel, TResult>(this IEnumerable<TModel> enumerable, DataSourceRequest request, Func<TModel, TResult> selector);
public static DataSourceResult ToDataSourceResult(this IEnumerable enumerable, DataSourceRequest request, ModelStateDictionary modelState);
public static DataSourceResult ToDataSourceResult<TModel, TResult>(this IQueryable<TModel> enumerable, DataSourceRequest request, Func<TModel, TResult> selector);
public static DataSourceResult ToDataSourceResult(this IQueryable queryable, DataSourceRequest request, ModelStateDictionary modelState);
public static DataSourceResult ToDataSourceResult<TModel, TResult>(this IEnumerable<TModel> enumerable, DataSourceRequest request, ModelStateDictionary modelState, Func<TModel, TResult> selector);
public static DataSourceResult ToDataSourceResult<TModel, TResult>(this IQueryable<TModel> enumerable, DataSourceRequest request, ModelStateDictionary modelState, Func<TModel, TResult> selector);