MySql 数据库的 EF6 生成日期比较 sql
EF6 generating date comparison sql for MySql database
我有一个内置于 .NETCore 2.1 中的 Web 应用程序,它调用内置于 .Net 4.6 中的 API。 API 调用使用 entity framework 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`
运行 sql 手动查询在 MySql workbench return 中没有行。如果我删除 @ 符号,它会按预期执行 return 行。我做错了什么?
我不明白为什么 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();
我有一个内置于 .NETCore 2.1 中的 Web 应用程序,它调用内置于 .Net 4.6 中的 API。 API 调用使用 entity framework 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`
运行 sql 手动查询在 MySql workbench return 中没有行。如果我删除 @ 符号,它会按预期执行 return 行。我做错了什么?
我不明白为什么 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();