2016-02-14 20 views
1

的Visual Studio生成對於我這個偉大航路,在那裏我可以加載一個實體:實體框架貪婪加載網頁API路線

// 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。我正在努力如何使用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的I認爲。但我也想加載PdfPagesPdf s。我如何修改此聲明以包含該聲明?要做的事情似乎是使用.Include(pdf => pdf.PdfPages),

+0

我認爲我們有這個[解決](HTTP:// codereview.stackexchange.com/a/119699/7251)? –

回答

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