我正在使用WebAPI和实体框架来构建指向大型MSSQL数据库(〜200个表)的REST API。数据库非常规范化,因此检索对API使用者有用的值需要大量的深入表格。实体框架/ LINQ - 从大型嵌套实体数据集返回数据传输对象
为了向用户返回有用的数据,我采用了使用工厂模式构建模型(或DTO)的方法。但是,我注意到即使所有数据都以良好的格式返回,由于启用了延迟加载,仍然存在性能问题。简而言之,即使在我只返回我需要的数据时,我仍然在查询太多的数据。
于是我使出关闭延迟加载,并试图抢在数据显式地使用包括如下的方法:
var accessions = db.AccessionParties
.Include(ap => ap.Accession.AccessionParties.Select(ap2 => ap2.Party))
.Include(ap => ap.Accession.AccessionParties.Select(ap2 => ap2.AccessionPartyPurposes.Select (app => app.PartyAccessionPurposeType)))
.Include(ap => ap.Accession.AccessionAnimals.Select(x => x.AnimalInformationType))
.Include(ap => ap.Accession.AccessionAnimals.Select(x => x.Specimens.Select(y => y.AccessionTestRequestSpecimens.Select(z => z.AccessionTestRequest.LabTestOffering.TestOffering))))
.ToList()
.Select(a => modelFactory.CreateAccessionModel(a.Accession));
下面是工厂方法我使用生成模型,其中包括一个例子嵌套的工厂方法以及塑造我的相关数据实体。
public AccessionModel CreateAccessionModel(Accession accession)
{
return new AccessionModel()
{
AccessionKey = accession.AccessionKey,
SubmittedDate = accession.SubmittedDate,
Parties = accession.AccessionParties
.Select(accessionParty => new { accessionParty = accessionParty, accessionParty.Party })
.Select(accessionParty => CreatePartyModel(accessionParty.Party)),
Animals = accession.AccessionAnimals.Select(accessionAnimal => CreateAccessionAnimalModel(accessionAnimal))
};
}
有没有处理上述情况的模式或做法?我见过一些方法的例子,它允许你传入一个包含语句的数组,但是我想不出一种以优雅,高效,实用的方式处理这个问题的方法。任何输入将不胜感激。
谢谢奥马尔。由于我在观看演示者建议不使用AutoMapper进行ASP WebAPI项目的教程,因为在我的模型中显示自定义数据时可能会出现一些限制,所以我最初对使用AutoMapper犹豫不决。但是,现在我正在给AutoMapper拍摄一笔亏损。 – 2014-12-07 15:30:04
与AutoMapper一起。到目前为止,它对我所需要的工作非常有效。 – 2014-12-18 18:19:54