您有一个包含 50 列的表
Person
。有时您想要查询 2 列,有时想要查询 10 列等。然后您使用实体框架选择从数据库中仅获取所需的列以改进查询。
PersonRepository
:
public PersonDto1 GetForSmallValidation()
{
return context.Persons.Select(x =>
new PersonDto1
{
Id = x.Id,
LastName = x.LastName,
}
);
}
public PersonDto2 GetActive()
{
return context.Persons
.Filter(x => x.Active)
.Select(x =>
new PersonDto2
{
Id = x.Id,
LastName = x.LastName,
FirstName = x.FirstName,
... // all fields
}
);
}
如果某些用例需要:额外的列、
.Include()
、过滤器,那么我需要一个单独的 Get
方法和 Dto 来满足所有这些需求。这些方法很难重用和管理。我觉得这是一个不好的做法,我需要一些泛型或可重用的方法。当我查询数据库时,我应该能够轻松地从调用服务中指定包含、特定列、过滤器。
问题:如何使用 EF 处理仅查询特定列?无论是使用存储库模式还是不通过在服务层调用
DbContext
。
我的初步解决方案和研究结果:
您刚刚发现了为什么您的存储库应该具有返回
IQueryable<Person>
而不是 DTO 的方法。 您可以编写任何您想要的查询并将返回结果投影到实体、匿名类型或 DTO 中。
幸运的是,您的 DbContext 已经是这样一个存储库,因此您不需要额外的存储库。