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; }
}
和Pdf
,JobFile
的子类:
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
,
答案 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);