【发布时间】:2012-12-01 15:09:27
【问题描述】:
我遇到了一个 LINQ 问题,希望您能帮我解决。
这就是正在发生的事情。
- 我从存储库中获得了
IQueryable<LicenseEntity>的实体。 - 我查看了这些实体中的字段,发现它们包含有效数据。 LicenseEntity 中有一个相关实体
Customer的字段。它也包含有效数据,因为我使用 LicenseEntity 加载了它。 - 我使用
.Select将每个 LicenseEntity 投影到 LicenseViewModel。 - 对于每个 LicenseEntity,一个 LicenseEntity 被传递到
AutoMapper.Mapper.Map并被加载到一个 LicenseViewModel 实体中。 - 在处理完所有实体后,当我在调试器中查看 LicenseViewModels 列表时,它会报告空引用异常并且没有要查看的项目。
- 为了确定 AutoMapper 是否是导致我的问题的原因,我将其替换为
MapMe()。当我停在 MapMe 中的 return 语句,查看s参数,这是原始实体时,我发现其中的数据是可以的,只是现在客户字段为空。我假设Select做了一些我不知道的事情。
如何使Select 在进行投影时保留原始实体中的所有信息?我们的解决方案无法实现该列表,因为它可能非常非常大。我在下面包含了我的测试代码,非常感谢您的帮助。
// Get the IQueryable<LicenseEntity> list of licenses from the repository.
var list = LicenseRepository.List();
// Convert the IQueryable<LicenseEntity> to an IQueryable<LicenseViewModel>
var vmlist = list.Select(x => MapMe(x, new LicenseViewModel()));
//var vmlist = list.Select(x => AutoMapper.Mapper.Map(x, new LicenseViewModel()));
// This function was used to see the LicenseEntity that was passing into Map().
// I discovered that the entity has all the correct data except for a related
// entity field, which was present in the original LicenseEntity before
public LicenseViewModel MapMe(LicenseEntity s, LicenseViewModel d)
{
return d;
}
以下代码可以正常工作,但是它实现了实体,这是我们无法做到的。
List<LicenseViewModel> vms = new List<LicenseViewModel>();
foreach (var item in list)
{
var vm = AutoMapper.Mapper.Map(item, new LicenseViewModel());
vms.Add(vm);
}
【问题讨论】:
标签: linq linq-to-entities automapper