在 linq 中调用自定义方法到没有 AsEnumerable 的实体



目前我有一些实体框架代码,如下所示:

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# 方法。

最新更新