实体框架Eager加载Web API路由

时间:2016-02-14 05:08:00

标签: c# entity-framework linq

Visual Studio为我创建了这条很棒的路径,我可以加载一个实体:

// GET: api/Jobs/5
[ResponseType(typeof(Job))]
public async Task<IHttpActionResult> GetJob(int id)
{
    Job job = await db.Jobs.FindAsync(id);

    if (job == null)
    {
        return NotFound();
    }

    return Ok(job);
}

以下是Job模型基于:

public class Job
{
    public Job()
    {
        this.Regions = new List<Region>();
        this.Files = new List<JobFile>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public List<Region> Regions { get; set; }
    public JobTypes JobType { get; set; }
    public int UserIDCreatedBy { get; set; }
    public int? UserIDAssignedTo { get; set; }
    public List<JobFile> Files { get; set; }
    public bool IsLocked { get; set; } // Lock for modification access
}

这里是JobFile类,Job有一个列表:

public class JobFile
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public int Job_ID { get; set; }
}

PdfJobFile的子类:

public class Pdf : JobFile
{
    public Pdf()
    {
        this.PdfPages = new List<PdfPage>();
    }

    public int Index { get; set; }

    public List<PdfPage> PdfPages { get; set; }
}

现在,当我点击该路线时,我想急切加载Pdf的所有Job s。我正在努力学习如何使用Linq编写该查询,特别是考虑到子类化在这里进行。我需要在路线中替换这一行:

Job job = await db.Jobs.FindAsync(id);

我认为我有一个开始:

// Eager load all the properties
IQueryable<Pdf> jobPdfs = (IQueryable<Pdf>)db.JobFiles.Where(jobFile => jobFile.Job_ID == id && jobFile is Pdf);

这应该让我认识到所有Pdf。但我也想加载PdfPages的{​​{1}}。如何修改此语句以包含该语句?要做的事情似乎是使用Pdf

1 个答案:

答案 0 :(得分:1)

您可以通过删除jobFile is Pdf条件来简化查询的where子句。只需像这样使用OfType<Pdf>

IQueryable<Pdf> jobPdfs = db.JobFiles
   .OfType<Pdf>()
   .Where(jobFile => jobFile.Job_ID == id);

要急切加载PdfPages类的Pdf集合,只需添加.Include(pdf => pdf.PdfPages),如下代码所示:

IQueryable<Pdf> jobPdfs = db.JobFiles
   .OfType<Pdf>()
   .Include(pdf => pdf.PdfPages)
   .Where(jobFile => jobFile.Job_ID == id);