在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或作为更好的解决方案创建一个类,将值发送到类的属性,然后返回它。