我需要从一个需要在LINQ查询中运行的函数中获取结果。这个结果绑定到网格,但在运行时遇到这个错误:
LINQ to Entities无法识别方法' System.String GetName(System.Type,System.Object)'方法,这个方法不能 翻译成商店表达。
这是我的代码:
public IQueryable GetForRah_CapacityList(XQueryParam param)
{
var result = (from x in Data()
select new
{
Rah_CapacityId = x.Rah_CapacityId,
Rah_CapacityName = x.Rah_CapacityName,
Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St),
Rah_LinesId = x.Rah_LinesId
}).OrderByDescending(o => new { o.Rah_CapacityId });
return result;
}
答案 0 :(得分:6)
GetName
无法转换为T-SQL,Linq to Entities无法识别它。您可以按如下方式修改代码:
var result = (from x in Data().AsEnumerable()
select new
{
Rah_CapacityId = x.Rah_CapacityId,
Rah_CapacityName = x.Rah_CapacityName,
Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St),
Rah_LinesId = x.Rah_LinesId
}).OrderByDescending(o => new { o.Rah_CapacityId });
在加载数据后.ToList()
,使用Linq to Objects对内存中的数据执行任何进一步的操作(如select)。
编辑:当您的查询为匿名类型的IQueryable
时,您的方法的返回类型为IOrderedEnumerable
,因此您应该要么将方法的类型更改为System.Object
,要么将其作为更好的解决方案创建一个类,将值发送到类的属性中,然后将其返回。
答案 1 :(得分:2)
您不能在Linq-To-Entities中使用此方法,因为LINQ不知道如何将Enum.GetName
转换为sql。因此,使用AsEnumerable
在内存中使用Linq-To-Objects执行它,并在查询后使用AsQueryable
获取所需的AsQueryable
:
所以:
var result = Data()
.OrderBy(x=> x.CapacityId)
.AsEnumerable()
.Select(x => new
{
Rah_CapacityId = x.Rah_CapacityId,
Rah_CapacityName = x.Rah_CapacityName,
Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St),
Rah_LinesId = x.Rah_LinesId
})
.AsQueryable();
在使用OrderBy
从数据库排序性能中受益之前,应首先使用AsEnumerable
。这同样适用于Where
,始终在AsEnumerable
(或ToList
)之前执行此操作。