【问题标题】:Entity Framework, filter in returned class the circular Icolleciton list immediately实体框架,立即在返回的类中过滤循环 Icolleciton 列表
【发布时间】:2013-01-04 23:02:40
【问题描述】:

使用新的 MVC 4 框架探索 REST 服务的精彩世界。 我偶然发现在返回的 JSON 数据中我想立即过滤而不用 EF 的问题。

我的员工班级:

    Imports System
    Imports System.Collections.Generic
Partial Public Class EMPLOYEE
    Public Property EM_ID As Long
    Public Property EM_FIRSTNAME As String
    Public Property EM_LASTNAME As String

    Public Overridable Property AS_EM As ICollection(Of AS_EM) = New HashSet(Of AS_EM)
End Class

我的 AS_EM 课程

Partial Public Class AS_EM
    Public Property ASE_ID As Long
    Public Property ASE_STATUS As String
    Public Property ASE_MOVE As String
    Public Property ASE_WHEN As Date
    Public Property ASE_EM_FK As Long
    Public Overridable Property EMPLOYEE As EMPLOYEE
End Class

下面的简化图。

一名员工可以有多个资产分配给他/她。

我的 EmployeeController 是这样构造的

    Public Function getEmployeebyOW(ByVal OW As String) As EMPLOYEE

        Dim context1 As New amsadmEntities
        Dim result = (From e In context1.EMPLOYEE
                 Where e.EM_CORPID = OW
                 Select e
                 ).FirstOrDefault
        Return result
    End Function

当我运行它时,我得到了我想要的,一个带有所有资产历史的 json 序列化员工,包括 ACT(ive) 和 PAS(sive)。屏幕截图显示了具有 PAS(ive) 资产分配的第一个

我想知道如何直接过滤资产分配列表,所以我只得到具有 ASE_STATUS="ACT" 的资产,直接在 LINQ 过滤器中应用它,而不使用匿名类型。

到目前为止,我发现的唯一方法是先检索 Employee 及其资产分配集合,然后将其删除,过滤该列表并重新附加。

    Public Function getEmployeebyOW(ByVal OW As String) As EMPLOYEE

        Dim context As New amsadmEntities
        Dim result = (From e In context.EMPLOYEE
                 Where e.EM_CORPID = OW
                 Select e
                 ).FirstOrDefault


        Dim goodentries As ICollection(Of AS_EM) =
               (From a In context.AS_EM
               Where a.ASE_EM_FK = result.EM_ID And a.ASE_STATUS = "ACT"
               Select a).ToList
        result.AS_EM.Clear()
        For j = 0 To goodentries.Count - 1
            result.AS_EM.Add(goodentries(j))
        Next
        Return result
    End Function

有没有更好更快的方法?无法在主 Linq 查询中对 Icollection 应用 Where 条件。

我想保持 EF 原样,因为员工的资产历史对于其他控制器和视图至关重要。

【问题讨论】:

    标签: vb.net entity-framework-4 linq-to-entities


    【解决方案1】:

    更好的方法是使用两个单独的 EF 查询来加载员工及其(他们的)活动资产。如果您在同一个上下文实例上执行这些查询,EF 应该会自动填充导航属性。

    如果您只需要加载单个员工,甚至可以使用EntityCollection.CreateSourceQuery 自动创建第二个查询。 Here 提到了过滤导航属性的所有典型选项。

    【讨论】:

    • 对,我直接在延迟加载的员工 linq 查询中寻找“魔术 linq 查询”,但首先在“GetEmployeeOW”函数中将其关闭,然后将活动设备添加到Icollection(禁用lazyl-add active to icollection)而不是使用lazyloading-清除Icollection结果-并再次添加它们。 Tnxs 指出来。
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多