LINQ 实体不生成有效 MySQL

LINQ Entity don't generate valid MySQL

您好,我在处理数据库时遇到了使用 Linq 的问题

var acks = (from a in db.eventsandacks
                    where a.triggerDate.Month == 1 && a.joinedrcat > 5 
                    && a.customerName == "CUSTOMER"
                    group a by new { a.triggerDate.Day } into b
                    orderby b.Key.Day
                    select new
                    {
                        Day = b.Key.Day,
                        Count = b.Count()
                    });

有趣的是,如果我只读出 Day 或 Count 而不是同时读出两者,它就会起作用。当我 运行 都收到此错误时。

MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'GroupBy1.K1' in 'field list'
  at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
  at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
  at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affected Rows, Int64& insertedId)
  at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)

  at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
  at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
  at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
  at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
  at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

生成的 SQL 看起来像这样。

{SELECT
`Project1`.`C3` AS `C1`, 
`Project1`.`C2`, 
`Project1`.`C1` AS `C3`
FROM (SELECT
`GroupBy1`.`A1` AS `C1`, 
`GroupBy1`.`K1` AS `C2`, 
1 AS `C3`
FROM (SELECT
COUNT(1) AS `A1`
FROM `eventsandack` AS `Extent1`
 WHERE ((1 = (MONTH(`Extent1`.`triggerDate`))) AND     (`Extent1`.`joinedrcat` > 5)) AND ('CUSTOMER' = `Extent1`.`customerName`)
 GROUP BY 
DAY(`Extent1`.`triggerDate`)) AS `GroupBy1`) AS `Project1`
 ORDER BY 
`Project1`.`C2` ASC}

当我 运行 直接在 MySQL 中查询时,我得到这个错误

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that                                                                                                                                                              ht syntax to use near '{SELECT
`Project1`.`C3` AS `C1`,
`Project1`.`C2`,
`Project1`.`C1` AS `C3`
FROM' at line 1

所以我想知道是否有人知道这个问题以及如何解决这个问题。 MySQL 服务器 运行ning 版本 (5.1.41)

根据我的评论,您的问题肯定是由 bug that is still present in the latest (6.9.6 版本的 MySql.Data.Entity.

引起的

不幸的是,由于这个错误,LINQ 中的大多数 group by 子句不能与 MySql 一起使用。

在最新版本中,该错误似乎会在 SQL 语句中创建虚构的列,而这些列根本不存在于架构中。

目前有两个 可行 痛苦的解决方案:1) 切换到 NHibernate,它具有良好的 LINQ-to-HQL 支持,或 2) 使用 .AsEnumerable.ToList

更新:2015 年 7 月 14 日发布了版本 6.9.7。根据 changelog,问题可能尚未解决