开发者

Entity Framework: how to do correct "Include" on custom type

开发者 https://www.devze.com 2023-01-21 05:04 出处:网络
Suppose we have 2 types, mapped to a Database via EF 4. Schedule 1.....1 Visit Also, we have third custom view type

Suppose we have 2 types, mapped to a Database via EF 4.

Schedule 1.....1 Visit

Also, we have third custom view type

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

So we can write the join query

var query = Context.Schedule.Join(Context.Visit
开发者_JS百科,/*Schedule join key definition*/,/*Visit join key definition*/,
(scheduleView, visit) => new ScheduleView {Schedule = scheduleView, Visit = visit})

The problem is that I need to load also Patient property of Visit type. But when I write

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

I receive a runtime error

Unable to cast the type 'System.Linq.IQueryable1' to type 'System.Data.Objects.ObjectQuery1'. LINQ to Entities only supports casting Entity Data Model primitive types.

So, the question is - how to force query to include something within my custom type?


Finally, developed some ugly workaround - introduced new member in custom type and explicitly queried for it.

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**})

Now I have Patient loading properly in my custom type. Amusing, but when I investigate ScheduleView.Visiting.Patient after introducing ScheduleView.Patient I found it also loaded. Cant get the EF logic in this case. And dunno how to force loading ScheduleView.Visiting.Patient without having to load useless ScheduleView.Patient :(


The error is spot on. Your trying to create an ObjectQuery (LINQ-Entities IQueryable), with a type (ScheduleView) which does not exist in your Model.

You can project into this type, sure - but not affect the query with it.

Will something like this work? (off the top of my head, untested)

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();

Your main problem is ObjectQuery<ScheduleView> is not translatable to a store expression. So do your include on the Visits entity set, not the IQueryable.

HTH

0

精彩评论

暂无评论...
验证码 换一张
取 消