C# 在linq中调用一个自定义方法来访问没有可计算属性的实体
目前,我有一些实体框架代码如下所示:C# 在linq中调用一个自定义方法来访问没有可计算属性的实体,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,目前,我有一些实体框架代码如下所示: return _context .MyData .OrderBy(x => x.Name) .Select(x => new CustomObject { Name = x.Name, Description = x.Description }); return _context .MyData .OrderBy(x => x.
return _context
.MyData
.OrderBy(x => x.Name)
.Select(x => new CustomObject { Name = x.Name, Description = x.Description });
return _context
.MyData
.OrderBy(x => x.Name)
.Select(x => CustomObjectFactory.Create(x));
我希望能够将我的CustomObject
代码的创建转移到一个单独的函数中,这样:
return _context
.MyData
.OrderBy(x => x.Name)
.Select(x => new CustomObject { Name = x.Name, Description = x.Description });
return _context
.MyData
.OrderBy(x => x.Name)
.Select(x => CustomObjectFactory.Create(x));
但当我这么做的时候,我得到了
Linq to实体无法识别该方法
错误。我知道我可以直接调用AsEnumerable()
:
但是我想知道如何在没有额外的AsEnumerable()
调用的情况下实现这一点。我很确定这涉及到某种复杂的表达式树
对于奖励积分,我还对如何做到这一点感兴趣:
return _context
.MyData
.OrderBy(x => x.Name)
.CreateCustomObject()
您不能这样做,因为在调用
AsEnumerable
之前,所有这些代码都将转换为数据库查询。此select中的代码不是常规代码,而是转换为sql语句的表达式。数据库不知道您的自定义方法-它只知道实体框架供应商定义的一些方法,有些库可以调用返回基元类型的函数
调用AsEnumerable
后,查询结果将具体化,因此可以使用常规的c方法。如果要在LINQ to Entities中包含扩展方法,则源参数(this
参数)和返回类型应设置为IQueryable
,以便可以将其转换为相应的SQL语句。相关问题:。我很确定它涉及到某种复杂的表达式树。
你是如何得出这个结论的?你可以自己动手实现IQueryable
,这样可以包装IQueryable.Provider并处理它,但你可能不想这样做。不,这不是真的,您可以创建自己的表达式来执行此操作。@Rocklan如果您使用自定义函数(如CustomObjectFactory),则只能使用new
并在表达式中初始化对象。create
提供程序将抛出。