【问题标题】:Entity Framework : Query with opposite condition in entity childs produce wrong results实体框架:在实体子项中具有相反条件的查询会产生错误的结果
【发布时间】:2015-02-21 05:47:18
【问题描述】:

我正在使用实体框架。

我有这个案例:

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

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

谢谢!

【问题讨论】:

    标签: vb.net entity-framework


    【解决方案1】:

    你没说,但你禁用了延迟加载。这意味着查询结束后,MyObj 实体的chld 对象 >= "08/08/2014" 在其chld 集合中。 Entity Framework 通过relationship fixup填充这些集合。

    因此,如果您访问MyObj.vls,则没有chld 的chld 集合,您将获得所需的结果。

    但是,查询包含chldMyObj 实体并随后在内存中进行处理会更有效。

    【讨论】:

    • 是的。延迟加载已禁用,但在主查询执行期间未执行计算总和的查询?因为如果我在类外有一个相同的总和查询,例如在投影内:.sumvl={与类内相同的查询},结果将是正确的。为什么部分类中的查询没有显示正确的结果?
    • 当然不是。属性vls 未映射。
    • 但是所有被选中的对象 MyObj1 都包含这个未映射的属性,那么为什么 .vls 没有得到值呢?那么当一个未映射的属性获得值时呢?
    • 你明白我的解释了吗? MyObj 实体在ToList() 之后包含哪些chld 对象?
    • 好的,但是为什么如果我从投影中删除部分: .chl=.......所以按照你的逻辑,每个 Myobj 对象在 tolist 之后都不会包含任何 chld 对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多