在 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
)之前执行此操作。
我需要从 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
)之前执行此操作。