Mysql 防止LINQ to EF查询中的“NOW()”

Mysql 防止LINQ to EF查询中的“NOW()”,mysql,linq,linq-to-entities,Mysql,Linq,Linq To Entities,更新:我最初的问题是无效的,因为我误读了MySql日志。很抱歉请参阅下面的更新 我正在使用LINQ查询: var作业=ctx.Threads.Wheret=>t.ClassName==10L &&t.EndDate!=无效的 &&开始日期时间,现在 .OrderByDowningo=>o.EndDate .FirstOrDefault; 这将创建SQL MySQL 5.5.14: 选择 `项目1`.`id`, `项目1`.`title`, `项目1`.`startdate`, `项目1`.`en

更新:我最初的问题是无效的,因为我误读了MySql日志。很抱歉请参阅下面的更新

我正在使用LINQ查询:

var作业=ctx.Threads.Wheret=>t.ClassName==10L &&t.EndDate!=无效的 &&开始日期时间,现在 .OrderByDowningo=>o.EndDate .FirstOrDefault; 这将创建SQL MySQL 5.5.14:

选择 `项目1`.`id`, `项目1`.`title`, `项目1`.`startdate`, `项目1`.`enddate`, `项目1`.`class`, `项目1`.`body`, `Project1`.`threadtype` 从选择 `Extent1`.`id`, `Extent1`.`title`, `Extent1`.`startdate`, `Extent1`.`enddate`, `Extent1`.`class`, `Extent1`.`body`, `Extent1`.`threadtype` 从…起 `线程'AS'扩展1` 其中'Extent1`.'class`='10L' 和“Extent1”。“enddate”不为空 还有'Extent1'。'startdate'现在 作为`项目1` 按“项目1”排序。“结束日期”说明 限制1 LINQ to EF如何知道使用NOW函数?当然我只是通过值传递一个常规的DateTime结构


如果我使用var now=DateTime.now;然后在LINQ查询中使用now变量,日期作为文本传递。发生了什么事?

通过解析表达式树将.NET代码转换为适当的SQL语言,将LINQ转换为任何操作。这允许查询在数据库端而不是客户端处理尽可能多的数据。因此,当你说:

... myField <= DateTime.Now

立即计算该值并将其存储到now中,该值将在查询中直接使用,而不是在表达式中使用。

DateTime.now是函数getter for now属性,因此linq2EF在尝试创建表达式树时将其视为函数。这就像说,.ToString在link2EF中是如何工作的。此外,当您从临时变量中使用它时,它将被视为临时变量,就像您在保存临时变量的结果时一样。ToString in temporary variable,最终更改不会影响您的输出。

问得好,回答得好。我只是想在我的环境中添加它,该环境使用Microsoft SQL Server 2008 R2,引用DateTime。现在,在LINQ to Entities查询中,生成以下SQL表达式:

将SysDateTime强制转换为datetime2

我相信这将类似于在MySQL中生成,因此无论底层数据库如何,都可以看到相同的行为


当然,如果您想要运行LINQ代码的本地时间而不是数据库服务器,那么这种行为可能会有问题。将DateTime.Now赋值给一个局部变量并在LINQ表达式中使用它的解决方法在MS SQL中工作得很好,正如预期的那样。

您是否尝试过现在重命名为now1?这可能是一个简单的错误。@dasblinkenlight我试着叫它cow,但没有改变。好主意。嗯,看起来翻译知道日期时间。现在是。如果你试图愚弄它,然后说一些像DateTime.ParseDateTime.Now.toSortDateString这样的话,会怎么样;对不起,伙计们,我的问题错了,我已经更新了。@James在你们编辑之后,神秘消失了!如何在不计算表达式引用的情况下解析表达式引用?@Magnus:使用C 3.0Cause DateTime.Now中提供的表达式API将其解析为引用DateTime对象的Now属性的成员访问表达式。它是由语义处理的,没有显式地评估值。这就是如何在不失去任何意义的情况下将转换完全转换为SQL。
var now = DateTime.Now;