我有以下代码,工作正常&正如所料:
return profileEntities.Select(x => (ProfileDTO)new ProfileDTO()
{
Localizations = new List<ProfileLocalizationDTO>()
}
.InjectFrom(x)).ToList();
但是,我想更进一步,并使用回购中的值填充Localizations
,如下所示:
return profileEntities.Select(x => (ProfileDTO)new ProfileDTO()
{
Localizations = _repoProfileLocalization
.Query(y => y.ProfileId == x.Id)
.Select(y => (ProfileLocalizationDTO)new ProfileLocalizationDTO().InjectFrom(y))
.ToList()
}
.InjectFrom(x)).ToList();
这会引发错误
发生了'System.NotSupportedException'类型的异常 EntityFramework.SqlServer.dll但未在用户代码中处理
其他信息:LINQ to Entities无法识别该方法 'System.Object InjectFrom(System.Object,System.Object [])'方法,和 此方法无法转换为商店表达式。
任何建议都非常感谢。
答案 0 :(得分:1)
对于第二个版本,您必须在AsEnumerable()
内调用Select
告诉clr方法InjectFrom
将在内存中执行。
return profileEntities.Select(x => (ProfileDTO)new ProfileDTO()
{
Localizations = _repoProfileLocalization
.Query(y => y.ProfileId == x.Id)
.AsEnumerable()
.Select(y => (ProfileLocalizationDTO)new ProfileLocalizationDTO()
.InjectFrom(y))
.ToList()
}
.InjectFrom(x)).ToList();
在第一个示例中,因为您在select中实例化了一个通用List,所以在select之后你将把所有结果都放在内存中,因为Linq不能在数据库上执行它。在第二个例子中,Linq仍在尝试在select中对数据库执行所有操作,但是您调用的方法无法转换为sql而您会收到错误。