我有一个查询并将其提供给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
?
答案 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