Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在linq中调用一个自定义方法来访问没有可计算属性的实体_C#_Entity Framework_Linq To Entities - Fatal编程技术网

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
提供程序将抛出。