Entity Framework: how to do correct "Include" on custom 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.IQueryable
1' to type 'System.Data.Objects.ObjectQuery
1'. 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
精彩评论