Reputation: 1095
OK, I'm not quite sure how to ask this, but basically I want to create a custom collection class that allows me to have properties on a generic list (Of T) such as:
Public ReadOnly Property TotalCalories() As Decimal
Get
Dim decTotal As Decimal = 0D
For Each thisFoodDiaryItem As FoodDiaryItem In Me
Dim thisNutValue As NutritionalData = (From nd In thisFoodDiaryItem.Food.NutritionalDatas Where nd.NutritionalDefinitionID = 208).FirstOrDefault
If thisFoodDiaryItem.Food.FoodWeights.Count > 0 Then
Dim decWeight As Decimal = thisFoodDiaryItem.Food.FoodWeights(0).WeightInGrams
If Not thisNutValue Is Nothing Then
Dim decCalories As Decimal = Math.Round((thisNutValue.Value * (decWeight / 100)) * thisFoodDiaryItem.Amount)
decTotal += decCalories
End If
End If
Next
Return decTotal
End Get
End Property
Public ReadOnly Property TotalSugars() As Decimal
Get
Dim decTotal As Decimal = 0D
For Each thisFoodDiaryItem As FoodDiaryItem In Me
Dim thisNutValue As NutritionalData = (From nd In thisFoodDiaryItem.Food.NutritionalDatas Where nd.NutritionalDefinitionID = 269).FirstOrDefault
If thisFoodDiaryItem.Food.FoodWeights.Count > 0 Then
Dim decWeight As Decimal = thisFoodDiaryItem.Food.FoodWeights(0).WeightInGrams
If Not thisNutValue Is Nothing Then
Dim decCalories As Decimal = Math.Round((thisNutValue.Value * (decWeight / 100)) * thisFoodDiaryItem.Amount)
decTotal += decCalories
End If
End If
Next
Return decTotal
End Get
End Property
I want this class to be used when calling entity framework queries:
Protected Sub BindFoodDiaryItems()
CurrentFoodDiaryItems = New FoodDiaryItemCollection
CurrentFoodDiaryItems = (From fdi In db.FoodDiaryItems Where fdi.PersonID = CurrentSiteUser.PersonID And fdi.EntryDate = CurrentDiaryDate).ToList
If AllMeals Is Nothing Then
AllMeals = (From m In db.Meals).ToList
End If
lvMealsA.DataSource = AllMeals
lvMealsA.DataBind()
lblTotalCalories.Text = CurrentFoodDiaryItems.TotalCalories.ToString
lblTotalSugars.Text = CurrentFoodDiaryItems.TotalSugars.ToString
lblTotalFats.Text = CurrentFoodDiaryItems.TotalFat.ToString
lblTotalProtein.Text = CurrentFoodDiaryItems.TotalProtein.ToString
lblTotalCarbs.Text = CurrentFoodDiaryItems.TotalCarbs.ToString
End Sub
I'm assuming it would go something like this:
Partial Public Class FoodDiaryItemCollection
Inherits List(Of FoodDiaryItem)
Sub New()
End Sub
End Class
Error I'm getting:
Unable to cast object of type 'System.Collections.Generic.List`1[NutritionBridgeModel.FoodDiaryItem]' to type 'NutritionBridgeModel.FoodDiaryItemCollection'.
TIA
Upvotes: 1
Views: 298
Reputation: 9931
The .Net Framework exposes a lot of awesome extension methods, like Sum, Average, etc...
http://msdn.microsoft.com/en-us/library/bb341635
Example:
class Program
{
static void Main(string[] args)
{
var sweetList = new List<int> { 4, 123, 5, 23, 42 };
Console.WriteLine("Average: {0}", sweetList.Average());
Console.WriteLine("Sum: {0}", sweetList.Sum());
var listOfCoolObjects = new List<CoolObject>();
listOfCoolObjects.Add(new CoolObject { Name = "1434", NeatValue = 42 });
listOfCoolObjects.Add(new CoolObject { Name = "asdf", NeatValue = 5 });
listOfCoolObjects.Add(new CoolObject { Name = "fgsdfg", NeatValue = 99 });
listOfCoolObjects.Add(new CoolObject { Name = "qwerty", NeatValue = 1345 });
listOfCoolObjects.Add(new CoolObject { Name = "casc", NeatValue = 111 });
Console.WriteLine("Average: {0}", listOfCoolObjects.Average(x => x.NeatValue));
Console.WriteLine("Sum: {0}", listOfCoolObjects.Sum(x => x.NeatValue));
}
}
class CoolObject
{
public string Name { get; set; }
public int NeatValue { get; set; }
}
In your code, you could do something like this:
var sum = (From fdi In db.FoodDiaryItems Where fdi.PersonID = CurrentSiteUser.PersonID And fdi.EntryDate = CurrentDiaryDate).Sum(fdi => fdi.SomeValueYouWantToSum)
I know you're coding in VB, but I don't know VB at all, so excuse any syntax errors in that last code chunk.
Upvotes: 1