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