LINQ to Entities无法识别方法'System.Object InjectFrom(System.Object,System.Object [])'

时间:2016-01-08 09:25:36

标签: c# entity-framework linq

我有以下代码,工作正常&正如所料:

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 [])'方法,和   此方法无法转换为商店表达式。

任何建议都非常感谢。

1 个答案:

答案 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而您会收到错误。