我有一个项目实体,它具有导航属性 ProjectNumbers、Addresses、Contacts 和 BBLInfos。我试图只选择每个导航属性的某些字段并将它们存储在视图模型中。
视图模型如下所示:
public class PropertyInfoViewModel
{
public ProjectViewModel Project { get; set; }
public IQueryable<ProjectNumberViewModel> ProjectNumbers { get; set; }
public IQueryable<AddressViewModel> Addresses { get; set; }
public IQueryable<BBLInfoViewModel> BBLInfos { get; set; }
public IQueryable<ContactsViewModel> Contacts { get; set; }
}
对项目 DbSet 调用 .Include 不起作用,因为它包含整个相关实体。
我能够通过分别对每个相关表进行查询并选择其 ProjectId 与项目匹配的实体来使其工作,但这需要 4 个单独的表查询。有没有更有效的方法来获取相关实体,而只从相关实体中选择几列?
这就是我目前正在做的事情:
PropertyInfoViewModel model = PropertyInfoViewModel.ViewModelSelector().Invoke(
new Repository<Project>(epicContext).Get(id),
new Repository<ProjectNumber>(epicContext).Get(projectNumber => projectNumber.ProjectId == id),
new Repository<Address>(epicContext).Get(address => address.ProjectId == id),
new Repository<BBLInfo>(epicContext).Get(bblInfo => bblInfo.ProjectId == id),
new Repository<Contact>(epicContext).Get(contact => contact.ProjectId == id)
然后 ViewModelSelector 只选择需要的字段:
public class PropertyInfoViewModel
{
public static Func<Project, IQueryable<ProjectNumber>, IQueryable<Address>, IQueryable<BBLInfo>, IQueryable<Contact>, PropertyInfoViewModel> ViewModelSelector()
{
return (project, projectNumbers, addresses, bblInfos, contacts, projectInfo) =>
new PropertyInfoViewModel()
{
Project = project,
ProjectNumbers = projectNumbers.Select(ProjectNumberViewModel.ViewModelSelector()).AsQueryable(),
Addresss = addresses.Select(AddressViewModel.ViewModelSelector()).AsQueryable(),
BBLInfos = bblInfos.Select(BBLInfoViewModel.ViewModelSelector()).AsQueryable(),
Contacts = contacts.Select(ContactViewModel.ViewModelSelector()).AsQueryable(),
};
}
ViewModelSelector 函数是这样的,所以我只需要编写一次 linq 查询的“.select”部分,然后我就可以重用它们。内部 ViewModelSelector 方法仅选择特定字段,如下所示:
public static Func<Address, AddressViewModel> ViewModelSelector()
{
return address => new AddressViewModel()
{
ProjectId = address.ProjectId,
AddressId = address.AddressId,
StreetNumber = address.StreetNumber,
StreetName = address.StreetName,
ZipCode = address.ZipCode
};
}
谢谢!