我使用的是实体框架。
我有个案子:
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
上,计算子对象在日期"08/08/2014“之前的数量总和。
在主查询中选择日期在"08/08/2014“之后的子项
此查询始终为Myobj1中的每个项目在vls
属性中生成0。( !!但是根据数据库中的数据,这不是真的!!)。
为什么这个查询产品会有这样的结果?
谢谢!
发布于 2015-02-20 21:47:18
你没有说,但是你已经禁用了延迟加载。这意味着在查询结束后,MyObj
实体的chld
集合中只有chld
对象>= "08/08/2014“。实体框架通过关系修复来填充这些集合。
因此,如果你访问MyObj.vls
,没有chld
的< "08/08/2014“。如果启用了延迟加载(并且上下文仍然在作用域中),这将触发加载完整的chld
集合,您将获得所需的结果。
但是,查询包含chld
的MyObj
实体,然后在内存中进行处理会更有效。
https://stackoverflow.com/questions/28622634
复制