实体框架:实体子项中具有相反条件的查询会产生错误的结果

时间:2015-02-20 06:07:12

标签: vb.net entity-framework

我正在使用实体框架。

我有这个案子:

 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。(!!但根据数据库中的数据,它不是真的!!)。

为什么此查询产品会产生这样的结果?

谢谢!

1 个答案:

答案 0 :(得分:0)

您没有告诉,但您已禁用延迟加载。这意味着在查询结束后,MyObj实体的chld集合中只有chld个对象&gt; =“08/08/2014”。实体框架通过 relationship fixup 填充这些集合。

因此,如果您访问MyObj.vls,则没有chld&lt; “2014年8月8日”。启用延迟加载(并且上下文仍在范围内),这将触发提货完整的chld集合,您将获得所需的结果。

但是,查询包含MyObj的{​​{1}}实体更有效,然后在内存中进行处理。