我正在使用实体框架。
我有这个案子:
Partial Public Class Myobj
Public Property id As Integer
Public property name as string
Public Overridable Property chld As ICollection(Of chld) = New HashSet(Of chld)
End Class
Partial Public Class Myobj
Public shared cond1 as DateTime
<NotMapped> Public ReadOnly Property vls As integer
Get
Return chld.AsQueryable.Where(Function(t2) t2.date1<cond1).Select(Function(t3) t3.quantity).DefaultIfEmpty.Sum()
End Get
End Property
End Class
Partial Public Class chld
Public Property id As Integer
Public Property date1 as DateTime
Public Property quantity as Integer
Public Property ParentID as integer
Public Overridable Property MyObj1 As MyObj
End Class
现在我的表格上有这段代码:
Dim dt1 as DateTime=CDate("08/08/2014")
Myobj.cond1=dt1
Dim list1 = (From t In context.MyObj Select New With { _
.Parent = t, _
.chl = (From t2 In t.chld.AsQueryable.Where(Function(t3) t3.Date1>=dt1) Select t2)
}).ToList
如您所见,在未映射的属性vls
上计算儿童在日期之前的数量总和&#34; 08/08/2014&#34;。
在主要查询中选择日期为&#34; 08/08/2014&#34;
的儿童对于Myobj1中的每个项目,此查询总是在vls
属性中生成0。(!!但根据数据库中的数据,它不是真的!!)。
为什么此查询产品会产生这样的结果?
谢谢!
答案 0 :(得分:0)
您没有告诉,但您已禁用延迟加载。这意味着在查询结束后,MyObj
实体的chld
集合中只有chld
个对象&gt; =“08/08/2014”。实体框架通过 relationship fixup 填充这些集合。
因此,如果您访问MyObj.vls
,则没有chld
&lt; “2014年8月8日”。启用延迟加载(并且上下文仍在范围内),这将触发提货完整的chld
集合,您将获得所需的结果。
但是,查询包含MyObj
的{{1}}实体更有效,然后在内存中进行处理。