Jam*_*mes 6 mysql linq linq-to-entities
更新:我的原始问题无效,因为我误读了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();
Run Code Online (Sandbox Code Playgroud)
这创建了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
Run Code Online (Sandbox Code Playgroud)
LINQ到EF如何知道使用该NOW()功能?当然,我只是DateTime按价值传递一个常规结构?
如果我使用var now = DateTime.Now;然后now在LINQ查询中使用该变量,则日期将作为文字传递.这是怎么回事?
LINQ-to-what 的操作是通过解析表达式树将 .NET 代码转换为适当的 SQL 语言。这允许查询尽可能在数据库端而不是客户端进行处理。结果,当你说:
... myField <= DateTime.Now
Run Code Online (Sandbox Code Playgroud)
解析器使用表达式引用DateTime.Now,而不对其求值,以便将尽可能多的代码转换为适当的 SQL 语言。这使得 LINQ 能够高效工作,但副作用是,查询中的所有内容都被解释为表达式并尝试转换为适当的 SQL 代码。当您将其存储在变量中时,如下所示:
var now = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
该值会立即计算并存储到 中now,并且该值在查询中按字面意思使用,而不是表达式。