Я работаю над проектом, используя первую модель кода 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
Кроме того, это можетпредоставьте мне легкий доступ к общим свойствам (Имя), но теперь у меня нет много вариантов для преобразования их в их реальный тип, возможно, случай выбора вокруг TypeName.,.
Любые рекомендации приветствуются, также, пожалуйста, простите за любые ошибки кода выше, я набрал примеры из памяти, так как в данный момент у меня нет доступа к проекту.