坑爹的Entity Framework和Last/LastOrDefault
直接上代码
var point = pointRepository.LoadEntities(p => p.TaskID == taskid).LastOrDefault();
和
var point = pointRepository.LoadEntities(p => p.TaskID == taskid)
.OrderByDescending(p=>p.GPSPointID)
.FirstOrDefault();
看起来是一样的对不对,第一个根据条件选择最后一个,第二个热根据条件倒序查询选择第一个。
不不不,完全不一样,第一种是会报错的:
LINQ to Entities does not recognize the method 'xxx LastOrDefault[xxx](System.Linq.IQueryable`1[xxx])' method, and this method cannot be translated into a store expression.
也就是第一种的LINQ没法转换成SQL语言。第二种转换成的SQL代码:
SELECT TOP (1)
[Project1].[GPSPointID] AS [GPSPointID],
[Project1].[TaskID] AS [TaskID],
[Project1].[Longitude] AS [Longitude],
[Project1].[Latitude] AS [Latitude],
[Project1].[Altitude] AS [Altitude],
[Project1].[Speed] AS [Speed],
[Project1].[Time] AS [Time]
FROM ( SELECT
[Extent1].[GPSPointID] AS [GPSPointID],
[Extent1].[TaskID] AS [TaskID],
[Extent1].[Longitude] AS [Longitude],
[Extent1].[Latitude] AS [Latitude],
[Extent1].[Altitude] AS [Altitude],
[Extent1].[Speed] AS [Speed],
[Extent1].[Time] AS [Time]
FROM [dbo].[GPSPoints] AS [Extent1]
WHERE [Extent1].[TaskID] = @p__linq__0
) AS [Project1]
ORDER BY [Project1].[GPSPointID] DESC
Entity Framework不支持Last(),当然也不支持LastOrDefault()。相反,如果使用First()或者FirstOrDefault()就完全没有问题了,我猜是因为SQL语言原生有TOP()函数但是没有BOTTOM()函数来着。不过,真的是坑啊。