目前我有一些实体框架代码,如下所示:
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 to 实体无法识别该方法
错误。我知道我可以打电话给AsEnumerable()
:
return _context
.MyData
.OrderBy(x => x.Name)
.AsEnumerable()
.Select(x => CustomObjectFactory.Create(x));
但是我想知道如何在没有额外AsEnumerable()
电话的情况下做到这一点。我很确定它涉及某种复杂的表达式树。
对于奖励积分,我也对如何做到这一点感兴趣:
return _context
.MyData
.OrderBy(x => x.Name)
.CreateCustomObject()
您不能这样做,因为在调用AsEnumerable
之前,所有这些代码都将转换为数据库查询。此选择中的代码不是常规代码,而是一个expression
,它被转换为 sql 语句。数据库不知道您的自定义方法 - 它只知道您的实体框架供应商定义的一些方法,对于某些库,可以调用返回基元类型的函数。
调用后AsEnumerable
查询结果将具体化,因此可以使用常规 c# 方法。