在LINQ中获取结果函数而不转换为存储表达式

时间:2017-01-23 08:57:47

标签: c# entity-framework linq linq-to-entities

我需要从一个需要在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;
}

2 个答案:

答案 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)之前执行此操作。