【问题标题】:EF6 generating date comparison sql for MySql databaseEF6为MySql数据库生成日期比较sql
【发布时间】:2019-07-29 15:34:31
【问题描述】:

我有一个内置于 .NETCore 2.1 的 Web 应用程序,它调用一个内置于 .Net 4.6 的 API。 API 调用使用实体框架 6 的服务层。我正在连接到 MySql 数据库。我正在使用 Pomelo.EntityFrameworkCore.MySql 连接器。使用 LINQ 查询根据日期比较获取记录时,EF6 似乎将日期作为字符串文字进行比较。

我尝试了所有不同类型的 LINQ 查询变体,并在网上寻找可以进行日期比较的扩展库,但无济于事

这是 LINQ 查询

int year = DateTime.Now.Year;

                DateTime firstDayOfYear = new DateTime(year, 1, 1);

                DateTime lastDayOfYear = new DateTime(year, 12, 31);



                var startDate = firstDayOfYear.AddYears(-2);

                var endDate = lastDayOfYear.AddYears(-1);



                var company = dbContext.Companies.Where(c =>

                    c.Updating &&

                    c.UpdatedBy == username &&

                    c.LastUpdate > startDate &&

                    c.LastUpdate < endDate)

                    .FirstOrDefault();

这是生成的 SQL 的一部分。注意日期值之前的@符号

`Extent2`.`ID` AS `ID1`,

`Extent2`.`Name` AS `Name1`

FROM Company AS `Extent1` INNER JOIN `Table_2` AS `Extent2` ON `Extent1`.`ID` = `Extent2`.`ID`

WHERE ((((`Extent1`.`SomeFlag` != 1) AND (`Extent1`.`LastUpdate` > @'01/01/2017 00:00:00')) AND (`Extent1`.`LastUpdate` < @'31/12/2017 00:00:00')) AND ((`Extent1`.`ID` IN ( '1','2','6','7','8' )) AND (`Extent1`.`ID` IS NOT NULL))) AND (NOT ((`Extent1`.`Telephone` IS  NULL) OR ((LENGTH(`Extent1`.`Telephone`)) = 0)))) AS `Project1`

在 MySql 工作台中手动运行 sql 查询不会返回任何行。如果我删除 @ 符号,它确实会返回行,如预期的那样。我做错了什么?

【问题讨论】:

  • 您发布的 SQL 看起来像是由 EF6 生成的,而不是 EF Core(EF Core 查询不使用别名中的 ExtentProject)。
  • 你说得对。无论如何,问题仍然存在。知道如何解决这个问题吗?
  • 它似乎不存在(至少在最新的 EF Core 2.x 中) - startDate 被翻译成类似 @__startDate_0 的东西(参数)。
  • startDate 和 endDate 都被翻译成 sql 查询中的字符串文字。查看以 @ 符号为前缀的日期字符串。如果我在没有 @ 符号的情况下手动运行查询,则该查询可以完美运行。使用 @ 符号手动运行它,我什么也得不到。没有错误,还有数据。

标签: mysql linq date entity-framework-6 compare


【解决方案1】:

我不明白为什么 EF 以这种方式翻译 LINQ,所以我只是使用存储过程调用来绕过它。至少那时我可以自己编写 SQL。

int year = DateTime.Now.Year;

            DateTime firstDayOfYear = new DateTime(year, 1, 1);

            DateTime lastDayOfYear = new DateTime(year, 12, 31);



            var startDate = firstDayOfYear.AddYears(QueueConfig.UpdateQueueStartDateInYears);

            var endDate = lastDayOfYear.AddYears(QueueConfig.UpdateQueueStartDateInYears);



            var userParam = new MySql.Data.MySqlClient.MySqlParameter("userName", username);

            var sdParam = new MySql.Data.MySqlClient.MySqlParameter("startDate", startDate);

            var edParam = new MySql.Data.MySqlClient.MySqlParameter("endDate", endDate);

            var lockedCompany = dbContext.Database.SqlQuery<CompanyDto>("CALL GetLockedCompany(@userName,@startDate,@endDate)", userParam, sdParam, edParam);



            var companyDto = lockedCompany.SingleOrDefault();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2012-12-20
    相关资源
    最近更新 更多