gpt4 book ai didi

vb.net - 延迟加载具有条件的 Entity Framework EntityCollection

转载 作者:行者123 更新时间:2023-12-04 15:37:43 25 4
gpt4 key购买 nike

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

Person            PersonMeal           Meal
------ 1---* ---------- *---1 -----
ID ID ID
... PersonID ...
MealID
Value
...

我有一个列表 Person通过存储过程通过 Entity Framework 检索到的对象。我有一个 View ,只显示一个 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

问题是这是加载整个集合。当然,这是一个小集合,因此在最坏的情况下,我可以将其全部加载,然后删除除我需要的之外的所有内容,但这远非理想。另外,我不确定是否有可能不触发任何修改集合的事件,因为它们一开始就不应该在那里。

最佳答案

在这种情况下,不要使用 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

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

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

关于vb.net - 延迟加载具有条件的 Entity Framework EntityCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2923593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com