gilpach
gilpach

Reputation: 1385

Entity Framework eager loading navigation property causes error when using user-defined type

Some background

I'm wanting to bind a list of objects (my model-view) to a grid. The model-view contains fields for both an specific entity and fields from a joined entity.

I was getting an error when I would try to bind due to the dbContext being out of scope. I realized I needed to use the .Include() method in order to eager load my navigation property. However, I suspect that since I'm using Linq to Entities, that I'm now generating another error:

"Unable to cast the type 'System.Linq.IQueryable1' to type 'System.Data.Objects.ObjectQuery1'. LINQ to Entities only supports casting EDM primitive or enumeration types."

My code is shown below, any ideas of what I need to do here?

Thanks in advance!

    public static List<PlanViewModel> GetPlans()
    {
        using (var context = new RepEntities())
        {

            var query = (from p in context.Plans
                join r in context.RealEstateDetails on p.ReId equals r.ReId
                select new PlanViewModel
                {
                    PlanName = p.PlanName,
                    TargetCompletionDate = p.TargetCompletionDate,
                    ActualCompletionDate = p.ActualCompletionDate,
                    Provision = p.Provision,
                    StatusTypeId = p.StatusTypeId,
                    StatusCommon = p.StatusCommon,
                    Building = r.BuildingName,
                    City = r.City,
                    Country = r.Country
                }).Include("StatusCommon");

            return query.ToList(); 
        }
    }

Upvotes: 0

Views: 348

Answers (1)

Lin
Lin

Reputation: 15188

You are almost there, just put Include("StatusCommon") right after context.Plans. Because you need to include StatusCommon before the iteration, this way you can set StatusCommon value for every iteration.

public static List<PlanViewModel> GetPlans()
        {
            using (var context = new RepEntities())
            {
                var query = (from p in context.Plans.Include("StatusCommon")
                    join r in context.RealEstateDetails on p.ReId equals r.ReId
                    select new PlanViewModel
                    {
                        PlanName = p.PlanName,
                        TargetCompletionDate = p.TargetCompletionDate,
                        ActualCompletionDate = p.ActualCompletionDate,
                        Provision = p.Provision,
                        StatusTypeId = p.StatusTypeId,
                        StatusCommon = p.StatusCommon,
                        Building = r.BuildingName,
                        City = r.City,
                        Country = r.Country
                    }).toList();
                return query;
            }
        }

Upvotes: 2

Related Questions