-1

使用新的 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 原样,因为员工的资产历史对于其他控制器和视图至关重要。

4

1 回答 1

1

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

如果您只需要加载单个员工,甚至可以使用EntityCollection.CreateSourceQuery. 这里提到了过滤导航属性的所有典型选项。

于 2013-01-05T11:30:19.520 回答