c# - ElementAtOrDefault 的替代方案

标签 c# .net-core entity-framework-core .net-core-3.1

我的业务逻辑如下。我有 CustomerEvents 表。该表包含 CreatedAt 列和 CustomerId 列。我需要检索特定客户的最后一个和以前的事件。关于最后我没有问题。但以前的事该怎么办呢?我已经尝试过ElementAtOrDefault。但这不起作用。我将向您展示我的代码:

PrevReDepDate = context.CustomerEvents.Where(y
        => y.Customer.CustomerId == 123 && y.EventType == "deposit" && y.Again == true)
    .Select(y => y.CreatedAt).OrderByDescending(y => y)
    .ElementAtOrDefault(1),

它不起作用。在我看来,发生这种情况是因为 EF 无法在数据库服务器端执行它。这是异常文本:

System.InvalidOperationException: Processing of the LINQ expression 'DbSet .ElementAtOrDefault(__p_0)' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information. at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)

我说得对吗?如果是,是否有其他方法可以获取上一个元素,例如借助 ElementAtOrDefault 的帮助?

最佳答案

您是对的,正如您所猜测的,ElementAtOrDefault 方法无法转换为 T-SQL,Linq to Entities 无法识别它。 您可以使用 SkipTake方法,像这样:

.Select(y => y.CreatedAt).OrderByDescending(y => y).Skip(1).Take(1)

作为另一种选择,您也可以使用 .ToList()AsEnumerable 方法,就像这个答案 https://stackoverflow.com/a/60896583/2946329 一样。 ,但您应该知道,通过在加载数据后使用它们,任何进一步的操作都是使用 Linq to Objects 对内存中已有的数据执行的。因此,如果您关心性能,我不确定使用这种方法是否适合您的情况。

关于c# - ElementAtOrDefault 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60967494/

相关文章:

c# - 如何合并两个列表并删除重复项

c# - 无法设置 Process.StartInfo.WorkingDirectory 以从 c# 调用 exe

c# - 如何使用 Entity Framework 4 Code First (POCO) 声明一对一关系

c# - ObjectListView 的 TreeListView 单元格编辑非常非常慢

c# - AWS SQS,如何计算消息属性的 MD5 消息摘要

docker - 在现有的 asp.net core docker 容器上安装 nginx

c# - 使用 Entity Framework Core 存储计算属性

c# - EF Core 包含在多个子级集合中

c# - 错误 : Cannot execute this command because Microsoft. EntityFrameworkCore.Design 未安装

c# - 如何从 .Net 核心应用程序中的 SQL 语句获取标量值?