未知列' Project2.Name'在' where子句'

时间:2016-04-21 11:38:21

标签: c# mysql entity-framework linq

我有一个简单的语句来从我的mySQL数据库中获取数据,但它收到以下错误:

  

[MySqlException(0x80004005):未知列' Project2.Name'在'哪里   子句'] MySql.Data.MySqlClient.MySqlStream.ReadPacket()+272
  MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow,   Int64的&安培; insertedId)+68
  MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId,Int32&   affectedRows,Int64& insertedId)+17
  MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId,Boolean   force)+110 MySql.Data.MySqlClient.MySqlDataReader.NextResult()   +761 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior)   行为)+1557
  MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(的CommandBehavior   行为)+33
  System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)   +12 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand)   entityCommand,CommandBehavior行为)+435

声明:

using (myEntities ctx = new myEntities())
{
    var Result = ctx.Items.Where(x => x.Contact.Country == Country)
                .GroupBy(p => p.Name).Where(x => !x.Any(y => y.Value == "X"))

                .Select(g => g.OrderByDescending(p => p.Date).FirstOrDefault()) //<- Error
                .Select(g => g.FirstOrDefault()) // <- no Error

                .ToList();
}

当我使用第一个Select时,我得到了这个错误,第二个,代码运行正常。谁知道原因?

找到相同的错误here

我使用的是.NET Connector 6.7.4,因此它can't是错误#68513

3 个答案:

答案 0 :(得分:3)

让我们看看。您有一个完全有效的LINQ to Entities查询,它适用于SqlServer提供程序,不适用于MySQL提供程序。对我来说听起来像一个MySQL提供程序错误,它可能是什么?但是哪一个?我不知道这有什么帮助,但是我在#78610(由ASP MVC MsSql to MySQL migration SO帖子发起)下注,标记为#76663的副本。或#77543等。

因此,MySQL连接器在子查询中存在OrderBy的问题。作为一种解决方法,我可以建议(在可能的情况下)实现MaxBy的替代方法,即(在伪代码中)而不是seq.OrderByDescending(col).FirstOrDefault()使用有效的seq.FirstOrDefault(col == seq.Max(col))模式:

var Result = ctx.Items
    .Where(x => x.Contact.Country == Country)
    .GroupBy(p => p.Name)
    .Where(g => !g.Any(x => x.Value == "X"))
    .Select(g => g.FirstOrDefault(e => e.Date == g.Max(e1 => e1.Date)))
    .ToList();

答案 1 :(得分:1)

分组前排序。查询提供程序只能翻译有限数量的表达式树,而您拥有它的方式显然就是其中之一。首先排序将具有相同的行为。

var query = ctx.Items
    .Where(x => x.Contact.Country == Country)
    .OrderByDescending(x => x.Date)
    .GroupBy(p => p.Name)
    .Where(g => !g.Any(x => x.Value == "X"))
    .Select(g => g.FirstOrDefault());

答案 2 :(得分:0)

您可以捕获代码生成的SQL,请参阅https://stackoverflow.com/a/20751723/3572241以及该问题的其他答案。

然后尝试在mysql中运行SQL以隔离问题。