从EF中选择带有LINQ的匿名类型时,在选择对象时是否无法对对象运行方法?

Mat*_*att 4 linq linq-to-entities entity-framework anonymous-types .net-3.5

假设我有一个方法:

bool myMethod(int a)
{
//return a bool
}
Run Code Online (Sandbox Code Playgroud)

所以我要说以下内容

// assume a has prop1 and prop2 both ints
var mySelection = from a in myContainer 
                  where a=somecondition 
                  select new {
                         a.prop1,
                         myMethod(a.prop2)
                     };
Run Code Online (Sandbox Code Playgroud)

真的没有办法在匿名类型声明中运行myMethod吗?有某种伎俩吗?

我可以在那里放一个匿名方法来返回myMethod(a.prop2)的等价物吗?

Ale*_*mes 11

好吧,让我们分成LINQ to Objects和LINQ to Entities

在LINQ to Object中,上述操作失败,因为编译器不知道属性名称是什么,如果将其更改为:

var mySelection = from a in myContainer
                  where a=somecondition 
                  select new {
                         a.prop1,
                         prop2 = myMethod(a.prop2)
                     };
Run Code Online (Sandbox Code Playgroud)

它将在LINQ to Objects中工作

但是实体框架将无法转换方法调用(除非它是EF已知的函数,如模型定义函数,EdmMethods或SqlMethods),因此您必须重写该查询,如下所示:

var mySelection = from a in myContainer
                  where a=somecondition 
                  select new {
                         a.prop1,
                         a.prop2
                     };

var myResults = from a in mySelection.AsEnumerable()
                select new {a.prop1, prop2 = myMethod(a.prop2)};
Run Code Online (Sandbox Code Playgroud)

这会从数据库中获取所需内容,然后使用AsEnumerable()调用将对myMethod的调用转换为LINQ to Objects而不是LINQ to Entities处理的内容

希望这可以帮助

亚历克斯