微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LINQ To Entities无法识别方法Last真?

如何解决LINQ To Entities无法识别方法Last真?

这种局限性归结为这样一个事实,即最终它必须将该查询转换为 而sql具有SELECT TOP(在T-sql中)但没有SELECT BottOM(没有这种东西)。

不过,有一种简单的方法,就是先 然后执行a First(),这就是您所做的。

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

另一种效率较低的替代方法- -是.ToList()在之前调用您的数据.Last(),它将立即执行到那时为止已建立的LINQ To Entities Expression,然后您的.Last()将起作用,因为在那一点上,.Last().Last()有效地执行了改为 Expression。(正如您所指出的那样,它可能会带回成千上万的记录和浪费的cpu实现对象,这些对象将永远不会被使用)

再次,我不建议您再进行此操作,但这确实有助于说明LINQ表达式执行的位置和时间之间的差异。

解决方法

在此查询中:

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系统中会有如此基本的限制?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。