-1

新しい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

以下の簡略図。

DBschema

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をそのままにしておきたいと思います。

4

1 に答える 1

1

より良い方法は、2つの別々のEFクエリを使用して、従業員とその(彼らの)アクティブなアセットをロードすることです。同じコンテキストインスタンスでこれらのクエリを実行すると、EFはナビゲーションプロパティに自動的にデータを入力する必要があります。

単一の従業員のみをロードする必要がある場合は、を使用して2番目のクエリを作成することも自動化できますEntityCollection.CreateSourceQueryここでは、ナビゲーションプロパティをフィルタリングするためのすべての一般的なオプションについて説明します。

于 2013-01-05T11:30:19.520 に答える