Entity Framework: как правильно сделать «Включить» в пользовательский тип - PullRequest
4 голосов
/ 26 октября 2010

Предположим, у нас есть 2 типа, сопоставленные с базой данных через EF 4.

Schedule 1.....1 Visit

Кроме того, у нас есть третий пользовательский тип представления

public class ScheduleView
{
    public Schedule Schedule { get; set; }
    public Visit Visit { get; set; }
}

Таким образом, мы можем написать запрос на соединение

var query = Context.Schedule.Join(Context.Visit
,/*Schedule join key definition*/,/*Visit join key definition*/,
(scheduleView, visit) => new ScheduleView {Schedule = scheduleView, Visit = visit})

Проблема в том, что мне нужно загрузить также Patient свойство типа Visit.Но когда я пишу

query = (query as ObjectQuery<ScheduleView>).Include("Visit.Patient");

, я получаю ошибку времени выполнения

Невозможно привести тип 'System.Linq.IQueryable 1' to type 'System.Data.Objects.ObjectQuery 1'.LINQ to Entities поддерживает только приведение типов примитивов Entity Data Model.

Итак, вопрос - как заставить запрос включить что-то в мой пользовательский тип?

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

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

public class ScheduleView
{
    public Schedule Schedule { get; set; }
    public Visit Visit { get; set; }
    **public Patient Patient{ get; set; }**
}

    var query = Context.Schedule.Join(Context.Visit
    ,/*Schedule join key definition*/,/*Visit join key definition*/,
    (scheduleView, visit) => new ScheduleView 
{Schedule = scheduleView, Visit = visit, **Patient = visit.Patient**})

Теперь у меня Patient правильно загружается в мой пользовательский тип. Забавно, но когда я исследую ScheduleView.Visiting.Patient после введения ScheduleView.Patient, я обнаружил, что он также загружен. Не могу получить логику EF в этом случае. И не знаю, как заставить загрузку ScheduleView.Visiting.Patient без необходимости загружать бесполезно ScheduleView.Patient: (

0 голосов
/ 26 октября 2010

Ошибка на месте.Вы пытаетесь создать ObjectQuery (LINQ-Entities IQueryable) с типом (ScheduleView), которого нет в вашей модели.

Вы можете проецировать в этот тип, конечно, но неповлиять на запрос.

Будет ли что-то подобное работать?(вне головы, непроверенный)

var scheduleViews = (from s in ctx.Schedules
                     join v in ctx.Visits.Include("Patient") 
                     on v.ScheduleId equals s.ScheduleId
                     select new ScheduleView 
                     { 
                        Schedule = s, 
                        Visit = v 
                     }).ToList();

Ваша главная проблема в том, что ObjectQuery<ScheduleView> не переводится в выражение магазина.Так что включайте в набор сущностей Visits, а не IQueryable.

HTH

...