English 中文(简体)
在 LINQ 中防止 NOW () 到 EF 查询
原标题:Prevent NOW() in LINQ to EF query

<强度 > UPDATE : 我的原始问题无效, 因为我读错了 MySql 日志 。 抱歉。 请参看下面, 已更新 。

我使用 LINQ 查询 :

var homework = ctx.Threads.Where(t => t.ClassName == "10L"
                                   && t.EndDate != null
                                   && t.StartDate <= DateTime.Now
                                   && t.EndDate > DateTime.Now)
                          .OrderByDescending(o => o.EndDate)
                          .FirstOrDefault();

这创建了 SQL (MYSQL 5.5. 14):

SELECT
`Project1`.`id`,
`Project1`.`title`,
`Project1`.`startdate`,
`Project1`.`enddate`,
`Project1`.`class`,
`Project1`.`body`,
`Project1`.`threadtype`
FROM (SELECT
     `Extent1`.`id`,
     `Extent1`.`title`,
     `Extent1`.`startdate`,
     `Extent1`.`enddate`,
     `Extent1`.`class`,
     `Extent1`.`body`,
     `Extent1`.`threadtype`
     FROM
     `threads` AS `Extent1`
     WHERE (((`Extent1`.`class` =  10L )
         AND (`Extent1`.`enddate` IS NOT NULL))
         AND (`Extent1`.`startdate` <= (NOW())))
         AND (`Extent1`.`enddate` > (NOW())))
AS `Project1`
ORDER BY `Project1`.`enddate` DESC
LIMIT 1

LINQ 到 EF 如何知道使用 < code> NOW () 函数? 我当然只是通过一个普通的 < code> DateTime 结构的数值?

如果我现在使用 var = DateTime. now; ,然后在 LINQ 查询中使用 现在的 变量, 日期会以字面形式传递。 正在发生什么?

最佳回答

LINQ 到 - 任何通过解析表达式树操作的 LINQ, 以便从. NET 代码转换为相应的 SQL 语言。 这样查询就可以在数据库边处理尽可能多的数据, 而不是客户端处理。 因此, 当您说 :

... myField <= DateTime.Now

解析器使用表达式引用 DateTime. now , 而不对其进行评估, 以便尽可能将代码转换为适当的 SQL 语言。 这是允许 LINQ 高效工作, 但作为副作用, 查询中的 allthing 被解释为表达式, 并试图转换为相应的 SQL 代码。 当您将其存储在变量中时, 以 :

var now = DateTime.Now;

立即对数值进行评估,并将其存储到 now ,该数值在查询中使用,而不是表达式。

问题回答

DateTime. now is a 函数( 改善当前属性), 所以在试图制作表达式树时, linq2EF 将视它为函数 。 这就像说, 如何使用 < code>. ToString () 在链接2EF 中工作。 另外, 当您从临时变量中使用它时, 它将被视为临时变量, 就像您在临时变量中保存 < code > 的结果一样。 ToString () 中, 最后的修改不会影响您的输出 。

良好的问答。 我只是想补充一下,在我的环境中,使用微软 SQL 服务器2008 R2, 引用 DateTime. 现在 在LINQ 中为实体查询提供以下 SQL 表达式:

CAST( SysDateTime () AS 日期时间2)

我相信这类似于在 MySQL 中生成 < code> noOW () , 因此无论基础数据库如何, 都可以看到同样的行为 。

当然, 如果您想要您的 LINQ 代码运行的时间与数据库服务器相对, 此行为可能会成为一个问题。 指定 < code> DateTime. now 给本地变量并用在 LINQ 表达式中的工作环境会像预期的那样与 MS SQL 运行良好 。





相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

php return a specific row from query

Is it possible in php to return a specific row of data from a mysql query? None of the fetch statements that I ve found return a 2 dimensional array to access specific rows. I want to be able to ...

Character Encodings in PHP and MySQL

Our website was developed with a meta tag set to... <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> This works fine for M-dashes and special quotes, etc. However, I ...

Pagination Strategies for Complex (slow) Datasets

What are some of the strategies being used for pagination of data sets that involve complex queries? count(*) takes ~1.5 sec so we don t want to hit the DB for every page view. Currently there are ~...

Averaging a total in mySQL

My table looks like person_id | car_id | miles ------------------------------ 1 | 1 | 100 1 | 2 | 200 2 | 3 | 1000 2 | 4 | 500 I need to ...