gpt4 book ai didi

c# - 为什么 LINQ 不喜欢内联日期计算?

转载 作者:太空狗 更新时间:2023-10-30 00:48:04 24 4
gpt4 key购买 nike

这个涉及 DateTime 计算的 LINQ 表达式可以很好地编译:

var jobsSinceLastRun = _rep.GetJobs(j => j.CompletedDate > DateTime.Now.AddMonths(-1));

但是当您尝试运行它时,会抛出一个错误:

LINQ to Entities does not recognize the method 'System.DateTime AddMonths(Int32)' method, and this method cannot be translated into a store expression.

很容易修复:

DateTime oneMonthAgo = DateTime.Now.AddMonths(-1);
var jobsSinceLastRun = _rep.GetJobs(j => j.CompletedDate > oneMonthAgo);

但这很容易让我想知道,在幕后,是什么导致 LINQ 拒绝内联计算?抽象的哪一部分失败了?

最佳答案

因为有一个从 lambda 创建的表达式树,包括这个内联计算。 IQueryable 接口(interface)的 LINQ 方法需要表达式树类型而不是委托(delegate)。所以对于表达:

j => j.CompletedDate > DateTime.Now.AddMonths(-1)

EF 6 的表达式访问者尝试将 DateTime.Now.AddMonths(-1) 转换为 SQL,但由于不支持此方法的转换,所以无法成功。例如,在 EF Core 中支持它,因此可以翻译表达式。对于表达:

j => j.CompletedDate > oneMonthAgo

表达式 visitor 可以将 oneMonthAgo 转换为 SQL,因为它是一个变量,其值可以只包含在 SQL 中。

关于c# - 为什么 LINQ 不喜欢内联日期计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50232888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com