M Kenyon II
M Kenyon II

Reputation: 4264

Linq query to include items with on a join object

I'm trying to get a collection of objects using a Linq query that would include child objects. I can do an include on the main table and get results. But if I do an include on one of the tables I join to, I do not get the object that should be returned by the include.

Here are my models:

public class RequestReviewViewModel
{
    public Guid RequestId { get; set; }
    public Guid ResourceToReviewId { get; set; }
    public Guid ReviewRequiredId { get; set; }
    public ReviewRequired ReviewRequired { get; set; }
}

public class Required : BaseEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid RequiredId { get; set; }

    [Display(Name = "Review Name")]
    public int ReviewNameId { get; set; }
    [ForeignKey("ReviewNameId")]
    public ReviewName ReviewName { get; set; }
}

Here's the linq query I'm trying. The line Required.Include(revr => revr.ReviewName) doesn't seem to do anything:

var requests = (from req in Request.Include(rr => rr.Resource)
    join revreq in Required.Include(revr => revr.ReviewName) 
        on req.ReviewRequiredId equals revreq.RequiredId
    where req.IsActive
    select new RequestReviewViewModel
    {
        RequestId = req.RequestId,
        ResourceToReviewId = req.ResourceToReviewId,
        ReviewRequiredId = req.ReviewRequiredId,
        Required = revreq
    };

requests.FirstOrDefault().Required.ReviewName.Dump();

While requests.FirstOrDefault().Required.ReviewNameId has a value, the ReviewName object is null. The relationship is in the database, and was created by Code First.

Upvotes: 2

Views: 1054

Answers (1)

Alexander Derck
Alexander Derck

Reputation: 14488

Your ReviewName is not declared virtual which enables eager/lazy loading (and automatic change-tracking to be complete). Add virtual and it should work:

public virtual ReviewName ReviewName { get; set; }

Upvotes: 2

Related Questions