我的业务逻辑如下。我有 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 无法识别它。
您可以使用 Skip
和 Take
方法,像这样:
.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/