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

Get result function in LINQ without translate to store expression

我需要从 LINQ 查询中 运行 需要的函数中获取结果。此结果绑定到网格,但在 运行 时间我遇到此错误:

LINQ to Entities does not recognize the method 'System.String GetName(System.Type, System.Object)' method, and this method cannot be translated into a store expression.

这是我的代码:

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;
}

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)。

编辑:此外,您的方法的 return 类型是 IQueryable,而您的查询是 匿名类型的 IOrderedEnumerable,因此您应该将方法的类型更改为 System.Object 或者作为更好的解决方案创建 class,将值发送到 class 的属性,然后 return它。

您不能在 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)之前执行此操作。