Как спроецировать свойство навигации с помощью Linq to Entities?

У меня есть база данных, созданная с использованием кода. Я обнаружил, что запрос с использованием проекции в конкретный тип, безусловно, является самым быстрым методом, быстрее, чем использование операторов Include. Однако я столкнулся со следующей проблемой:

dim records=(From record in db.SomeDbSet
             Where record.UserID=userID
             Select New UserSpecificRecord With
             { .Name=record.User.Name
               .Tasks=record.Tasks
             }).ToList

Я получаю разные ошибки при выполнении части .Tasks=, начиная от недопустимых исключений приведения до сообщений о том, что Enity Framework не поддерживает такого рода запросы, в зависимости от типа коллекции, которую я создаю для свойства Tasks класса UserSpecificRecord.

Когда я меняю код на:

 Dim records= (From record in db.SomeDbSet
                 Where record.UserID=userID
                 Select New With
                 { .Name=record.User.Name
                   .Tasks=record.Tasks
                 }).ToList

   dim userRecords=(From record in records
                    Select New UserSpecificRecord With
                    { .Name=record.Name
                     .Tasks=record.Tasks
                     }).ToList

то есть: я проектирую анонимный тип, а затем создаю конкретный тип, и все это работает. Я бы очень хотел иметь возможность проецировать на конкретный тип напрямую. Можно ли это сделать?


person Dabblernl    schedule 31.03.2013    source источник


Ответы (1)


Вы не можете спроецировать на «сущность» (ваш UserSpecificRecord тоже отображается? Судя по имени, да).
Дело не в «конкретном классе».

См. этот ответ . Запрос LINQ to Entities

person NSGaga-mostly-inactive    schedule 31.03.2013
comment
«UserSpecifiedRecord» — это не сущность, а класс для удобной агрегации данных, с которыми мне нужно работать. - person Dabblernl; 31.03.2013
comment
Трудно так сказать без кода. Не могли бы вы опубликовать свою уменьшенную модель (участвующие сущности), чтобы я мог запустить, а также ваш «конкретный» класс. И я на самом деле подозреваю, что это может быть что-то совершенно не связанное (поскольку вы упоминаете диапазон ошибок) и связанное с EF. кстати. вы используете сначала код или db-first - person NSGaga-mostly-inactive; 31.03.2013
comment
Я думаю, должно быть достаточно ясно: есть три объекта: записи, пользователь и задача, запись имеет много задач, пользователь имеет много записей. UserSpecificRecord — это DTO. - person Dabblernl; 31.03.2013
comment
Хорошо, спасибо, что проверили это для меня, я буду исследовать дальше. - person Dabblernl; 01.04.2013
comment
Спасибо за работу со мной. Ведь это сработало. Проблема была связана с унаследованными сущностями и преобразованиями типов. Более того, единственным типом коллекции, который может быть спроецирован напрямую, является IENumerable(Of TEntity) - person Dabblernl; 02.04.2013
comment
добро пожаловать - это, вероятно, "ковариация", тогда - IEnumerable определяется как out/ковариант и поддерживает преобразование вверх - например, из IEnumerable‹UserSpecificError› в IEnumerable‹IUserSpecificError› — в то время как с другими интерфейсами (это может быть только интерфейс, тем более для классов, например List‹›) не работает, если вы не определите его специально. Если интересно, вы можете увидеть некоторые пояснения, которые я сделал здесь или здесь. Всего наилучшего. - person NSGaga-mostly-inactive; 02.04.2013