在linq中调用不带AsEnumerable的实体的自定义方法

时间:2018-08-31 03:56:34

标签: c# entity-framework linq-to-entities

目前,我有一些看起来像这样的实体框架代码:

return _context
           .MyData
           .OrderBy(x => x.Name)
           .Select(x => new CustomObject { Name = x.Name, Description = x.Description });

我希望能够将CustomObject代码的创建移到一个单独的函数中,所以类似这样:

 return _context
           .MyData
           .OrderBy(x => x.Name)
           .Select(x => CustomObjectFactory.Create(x));

但是当我这样做时,我得到了

  

Linq实体无法识别该方法

错误。我了解我可以随便打给AsEnumerable()的电话:

return _context
          .MyData
          .OrderBy(x => x.Name)
          .AsEnumerable()
          .Select(x => CustomObjectFactory.Create(x));

但是我想知道如何在没有额外的AsEnumerable()调用的情况下执行此操作。我很确定它涉及某种复杂的表达式树。

对于奖励积分,我也对如何执行此操作感兴趣:

 return _context
            .MyData
            .OrderBy(x => x.Name)
            .CreateCustomObject()

1 个答案:

答案 0 :(得分:0)

您不能执行此操作,因为在调用AsEnumerable之前,所有这些代码都将转换为数据库查询。该选择内的代码不是常规代码,而是expression,它可以转换为sql语句。数据库不知道您的自定义方法-它仅了解您的实体框架供应商定义的某些方法,使用某些库可以调用返回原始类型的函数。

调用AsEnumerable后,查询结果会具体化,因此您可以使用常规的c#方法。