【问题标题】:linq to entity framework custom collection class that inherits list(Of T)linq to 继承 list(Of T) 的实体框架自定义集合类
【发布时间】:2012-08-08 16:33:44
【问题描述】:

好的,我不太清楚如何问这个问题,但基本上我想创建一个自定义集合类,允许我在通用列表 (Of T) 上拥有属性,例如:

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

我希望在调用实体框架查询时使用这个类:

 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

我假设它会是这样的:

    Partial Public Class FoodDiaryItemCollection
    Inherits List(Of FoodDiaryItem)

    Sub New()
    End Sub

    End Class

我得到的错误:

无法将“System.Collections.Generic.List`1[NutritionBridgeModel.FoodDiaryItem]”类型的对象转换为“NutritionBridgeModel.FoodDiaryItemCollection”类型。

TIA

【问题讨论】:

  • "我希望在调用实体框架查询时使用这个类:"您能否编辑您的示例以包含您想要的 CurrentFoodDiaryItems 用法?现在,你只需创建一个FoodDiaryItemCollection,然后你什么都不用做。

标签: asp.net vb.net entity-framework


【解决方案1】:

.Net 框架公开了许多很棒的扩展方法,例如 Sum、Average 等...

http://msdn.microsoft.com/en-us/library/bb341635

例子:

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; }
}

在您的代码中,您可以执行以下操作:

var sum = (From fdi In db.FoodDiaryItems Where fdi.PersonID = CurrentSiteUser.PersonID And fdi.EntryDate = CurrentDiaryDate).Sum(fdi => fdi.SomeValueYouWantToSum)

我知道你在用 VB 编码,但我根本不懂 VB,所以请原谅最后一个代码块中的任何语法错误。

【讨论】:

  • 对不起,我应该更具体地了解我的财产需求,它们比总和、平均等更复杂。只是以此为例。检查原始帖子以了解更新的需求。
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2011-05-19
  • 2010-10-07
  • 1970-01-01
相关资源
最近更新 更多