目前,我有一些看起来像这样的实体框架代码:
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()
答案 0 :(得分:0)
您不能执行此操作,因为在调用AsEnumerable
之前,所有这些代码都将转换为数据库查询。该选择内的代码不是常规代码,而是expression
,它可以转换为sql语句。数据库不知道您的自定义方法-它仅了解您的实体框架供应商定义的某些方法,使用某些库可以调用返回原始类型的函数。
调用AsEnumerable
后,查询结果会具体化,因此您可以使用常规的c#方法。