如何调用lambda表达式中的方法以在Entity Framework中运行?

时间:2014-02-22 11:59:23

标签: entity-framework lambda expression

我有一个查询并将其提供给Entity Framework来运行:

using (var context = new MyEFContext())
{
    var result = context.Items.Select(item => new {Type = item.GetType()}).ToList();
}

但是我遇到了调用系统方法的例外,例如GetType() :(

LINQ to Entities does not recognize the method 'System.Type GetType()' method,
and this method cannot be translated into a store expression.

我尝试动态创建lambda表达式,但运行动态表达式也有同样的问题。 如何将lambda表达式的方法提供给Entity Frameworkenter

3 个答案:

答案 0 :(得分:2)

您只需要在Select()

之前调用ToList()
using (var context = new MyEFContext())
{
    var result = context.Items.ToList().Select(item => new {Type = item.GetType()}).ToList();
}

这将首先执行context.Items.ToList()部分,该部分由Entity框架执行,然后Select在EF外部的本地列表中工作

如果您只想要一个字段

var result = (from item in  context.Items
select new 
{ 
field = item.yourfield
}).ToList().Select(p=> new {Type = p.field.GetType()}).ToList();

答案 1 :(得分:1)

您需要致电AsEnumerable(),以便使用Linq-To-Objects评估GetType,而不是Linq-To-Entities。 SQL中没有GetType的概念,需要在CLR中进行评估:

 using (var context = new MyEFContext())
 {
      var result = context.Items.AsEnumerable().Select(item => new {Type = item.GetType()}).ToList();
 }

不确定这是多么有用,因为您最终会得到Item类型的列表......

答案 2 :(得分:1)

使用以下代码:

using (var context = new MyEFContext())
 {
      var result = context.Items.AsEnumerable().ToList().Select(item => new {Type = item.GetType()}).ToList();
 }

item.GetType()函数是一个代码函数,必须在客户端运行。在您的代码中GetType函数想在服务器上运行。当您使用ToList()在客户端中推送的所有项目时,您可以在其上运行GetType()功能。

<强> EDIT1

您可以创建GetType扩展存储过程并使用以下代码:

using (var context = new MyEFContext())
 {
      var result = context.Items.AsEnumerable().Select(item => new {Type = GetType(Item)}).ToList();
 }

要在Linq中调用函数,请使用以下链接:Calling Functions in LINQ