延迟加载带有条件的实体框架EntityCollection

Age*_*191 6 vb.net entity-framework lazy-loading

在Entity Framework中(特别是EF 3.5,但如果它存在于EF 4中,它给我一个升级的理由)是否可以延迟加载只是集合的一部分?我也可能接近这个错误,所以我愿意接受建议.我的表/实体看起来类似于:

Person            PersonMeal           Meal
------    1---*   ----------   *---1   -----
ID                ID                   ID
...               PersonID             ...
                  MealID
                  Value
                  ...
Run Code Online (Sandbox Code Playgroud)

我有一个Person通过实体框架通过存储过程检索的对象列表.我有一个观点,一次只显示一个Meal,所以我只想要与该餐有关的信息.目前我的代码如下所示:

Function GetPersons() As List(Of Person)
    Dim personList = context.StoredProcedureCall(param1, param2, param3).ToList()
    personList.ForEach(Function(x) LazyLoadProperties(x))
    Return personList
End Function

' Work around function because VB lambdas don't take Sub's
Function LazyLoadProperties(ByVal person As Person) As Object
    If (Not person.PersonMeal.IsLoaded) Then
        person.PersonMeal.Load()
    End If
    Return Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

问题是这会加载整个集合.虽然它是一个小集合,所以最糟糕的情况我可以加载它然后删除所有我需要的,但这远非理想.另外,我不确定是否可以在不触发修改集合的任何事件的情况下,因为它们本来不应该在那里.

Yak*_*ych 2

在这种情况下,Load您可以只查询数据库中的数据,而不是使用该方法:

Function GetPersons() As List(Of Person)
    Dim personList = context.StoredProcedureCall(param1, param2, param3).ToList()

    Dim person As Person
    For Each person in personList
        person.PersonMeals = From pm in context.PersonMeals.Include("Meal")
                             Where pm.Person.Id == person.Id And pm.Meal.Id == Meal_ID
                             Take 1
    Next person

    Return personList
End Function
Run Code Online (Sandbox Code Playgroud)

我假设这person.PersonMeals是一个集合,否则您可以使用FirstOrDefault而不是Take.

在此查询中,我们基本上选择所有具有循环中当前人员 ID 和所需餐食 ID 的PersonMeals实体(连同 ) 。Meal如果您的数据库没有损坏的数据(具有相同 PersonID-MealID 组合的多行),则会有 0 或 1 个结果,这些结果将写入您的PersonMeals属性中。