c# – LINQ To Entities不识别方法Last。真?

在此查询中:

public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
    var context = DataContext.GetDataContext();
    return context.ServerOnlineCharacters
        .OrderBy(p => p.ServerStatus.ServerDateTime)
        .GroupBy(p => p.RawName)
        .Select(p => p.Last());
}

我不得不切换到这个工作

public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
    var context = DataContext.GetDataContext();
    return context.ServerOnlineCharacters
        .OrderByDescending(p => p.ServerStatus.ServerDateTime)
        .GroupBy(p => p.RawName)
        .Select(p => p.FirstOrDefault());
}

我甚至不能使用p.First(),镜像第一个查询。

为什么在这样一个强大的ORM系统中有这样的基本限制?

这个限制归结于这样的事实,最终它必须将查询翻译为SQL和SQL有一个SELECT TOP(在T-SQL),但不是一个SELECT BOTTOM(没有这样的事情)。

有一个简单的方法,但它,只是顺序降序,然后做一个First(),这是你做的。

编辑:
其他提供程序可能有不同的SELECT TOP 1的实现,在Oracle上它可能更像是WHERE ROWNUM = 1

编辑:

另一个效率较低的替代方案 – 我不推荐这个! – 是在.Last()之前调用你的数据上的.ToList(),它将立即执行到那时已经构建的LINQ To Entities表达式,然后你的.Last()将工作,因为在那一点.Last()在LINQ to Objects Expression的上下文中有效地执行。 (正如你所指出的,它可以带来成千上万的记录和废弃的CPU物化对象的负载,永远不会使用)

再次,我不建议这样做,但它确实有助于说明执行LINQ表达式的时间和地点之间的区别。

http://stackoverflow.com/questions/7293639/linq-to-entities-does-not-recognize-the-method-last-really

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – LINQ To Entities不识别方法Last。真?