在LINQ中获取结果函数而不转换为存储表达式
我需要从一个需要在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; }
您不能在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();
在使用AsEnumerable
从数据库排序性能中受益之前,应首先使用OrderBy
。 这同样适用于Where
,总是在AsEnumerable
(或ToList
)之前执行此操作。
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
或作为更好的解决方案创建一个类,将值发送到类的属性,然后返回它。