新しいMVC4フレームワークを使用して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
以下の簡略図。
1人の従業員に複数の資産を割り当てることができます。
私の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
それを実行すると、必要なものが得られます。これは、ACT(ive)とPAS(sive)の両方のすべてのアセット履歴を持つjsonシリアル化された従業員です。スクリーンショットは、PAS(ive)アセットが割り当てられた最初のものを示しています
アセット割り当てのリストを直接フィルタリングする方法を知りたいので、ASE_STATUS = "ACT"を持つアセットのみを取得し、匿名タイプを使用せずに、それをLINQフィルターに直接適用します。
私がこれまでに見つけた唯一の方法は、最初に従業員と彼のアセット割り当てのコレクションを取得してからドロップし、そのリストをフィルタリングして再アタッチすることです。
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をそのままにしておきたいと思います。