5

私は、EF 4.2 コードの最初のモデルを使用してプロジェクトに取り組んでいます。このモデルには、製品の TPH 継承構造が含まれています。この継承モデルのポリモーフィックな結果をディスクリミネーターでグループ化する必要があり、いくつかの問題が発生しています。

エンティティ フレームワークは、このグループ化を完了するための識別子を公開しません。私の最初の質問は、この識別器に直接アクセスできるかどうかです。私の読書と経験は私にノーと言っているので、私はこの種の作品の解決策を思いついた. うまく機能しておらず、どのように維持する必要があるかについて満足していません.

私のクラスは次のようになります(簡略化):

Public MustInherit Class Product
      <key()>  
      Public Property ProductID as integer

      <StringLength(50, ErrorMessage:="Max 50 characters")>
      <Required(ErrorMessage:="Product name is required")>
      Public Property Name as String

      <TimeStamp()>
      Public Property Time_Stamp as DateTime = DateTime.Now()
End Class

Public Class Desktop
      Inherits Product

      <StringLength(50, ErrorMessage:="Max 50 characters")>
      <Required(ErrorMessage:="Processor is required")>
      Public Property Processor as String
End Class

Public Class Monitor
      Inherits Product

      <Required(ErrorMessage:="Monitor size is required")>
      Public Property Size_Inches as Integer
End Class

製品を受け取り、そのベースタイプ名を文字列として返す拡張メソッドを構築しました。

<Extension()>
Public Function ProductType(ByVal inProduct as Product) as String
      ProductType = inProduct.GetType().BaseType.Name
End Function

そこで、製品の結果をタイプごとにグループ化する構造を構築して、それらを実行できるようにしました。

Dim tmpProducts = db.Products.ToList()
Dim GrpProducts = tmpProducts.GroupBy(Function(prod) prod.ProductType) _
                             .Select(Function(s) New With {.ProductType = S.Key,
                                                           .Products = S })

リストをループして目的の動作を取得できるようになりましたが、パフォーマンスは理想的ではなく、製品の数が増えるにつれて受け入れられなくなるのではないかと心配しています。

For Each ProductGroup in GrpProducts
       Dim TypeName as String = ProductGroup.ProductType
       Dim TypeProducts = ProductGroup.Products
Next

また、これにより共有プロパティ (名前) に簡単にアクセスできますが、これらを実際の型にキャストするための多くのオプションがありません。. .

任意の推奨事項を歓迎します。また、上記のコード エラーをご容赦ください。現時点ではプロジェクトにアクセスできないため、メモリから例を再入力しました。

4

2 に答える 2