Entity Framework, Table Per Type и Linq - Получение «Типа» - PullRequest
2 голосов
/ 23 января 2012

У меня есть абстрактный тип с именем Product и пять «Типов», которые наследуются от Product в виде таблицы по иерархии типов, как показано ниже:

Table Per Type

Я хочу получить всю информацию для всех Продуктов, включая совокупность свойств различных объектов, которые наследуются от продуктов, для проецирования их в новый класс для использования на веб-странице MVC. Мой запрос linq ниже:

     //Return the required products
    var model = from p in Product.Products
                where p.archive == false && ((Prod_ID == 0) || (p.ID == Prod_ID))
                select new SearchViewModel 
                    {
                        ID = p.ID,
                        lend_name = p.Lender.lend_name,
                        pDes_rate = p.pDes_rate,
                        pDes_details = p.pDes_details,
                        pDes_totTerm = p.pDes_totTerm,
                        pDes_APR = p.pDes_APR,
                        pDes_revDesc = p.pDes_revDesc,
                        pMax_desc = p.pMax_desc,
                        dDipNeeded = p.dDipNeeded,
                        dAppNeeded = p.dAppNeeded,      

                        CalcFields = new DAL.SearchCalcFields
                        {
                            pDes_type = p.pDes_type,
                            pDes_rate = p.pDes_rate,
                            pTFi_fixedRate = p.pTFi_fixedRate 
                        }
                    }

У меня проблема с доступом к p.pTFi_fixedRate , это не возвращается с коллекцией сущностей Products, как в супер типе Fixed. Как мне вернуть «супер» тип свойств Products (Fixed), используя Linq и Entity Framework. Мне действительно нужно вернуть некоторые поля из всех различных супертипов (Disc, Track и т. Д.) Для использования в вычислениях. Должен ли я вернуть их как отдельные запросы Linq, проверяющие тип возвращаемого «продукта»?

Ответы [ 3 ]

1 голос
/ 23 января 2012

Это действительно хороший вопрос. Я заглянул в книгу Джулии Лерман и изучил интернет, и не вижу элегантного ответа.

Если бы это был я, я бы создал объект передачи данных со всеми свойствами типов, а затем создал бы отдельный запрос для каждого типа, а затем объединил их все. Я вставил бы пробелы в свойства DTO, где свойства не относятся к этому типу. Тогда я надеюсь, что механизм EF сделает разумный удар по созданию достойного SQL.

Пример

var results = (from p in context.Products.OfType<Disc>
        select new ProductDTO {basefield1 = p.val1, discField=p.val2, fixedField=""})
         .Union(
        from p in context.Products.OfType<Fixed>
        select new ProductDTO {basefield1 = p.val1, discField="", fixedField=p.val2});

Но это не может быть лучшим ответом, не так ли? Есть ли другие?

1 голос
/ 23 января 2012

То есть Fixed наследуется от Product?Если это так, то вам, вероятно, следует вместо этого запросить Fixed, и свойства Product будут включены в него.

Если вы просто выполняете вычисления и получаете какие-то итоги или что-то подобное, вы можете захотеть взглянуть на использование сохраненногопроцедура.Это уменьшит количество обращений к базе данных и позволит значительно ускорить выполнение.

0 голосов
/ 23 января 2012

Ну, это зависит от вашей модели, но обычно вам нужно сделать что-то вроде:

var model = from p in Product.Products.Include("SomeNavProperty")
.... (rest of query)

Где SomeNavProperty - это тип объекта, который загружает pTFi_fixedRate .

...