MySQL Connector / NET Any()里面的Where()导致NotImplementedException

时间:2014-04-30 20:26:42

标签: c# mysql linq entity-framework connector-net

我有一个动态生成的查询,用于搜索相当大的记录集。我通过带有实体框架6的NuGet包使用MySQL Connector / NET 6.8.3。Expression内部执行的Where是以编程方式构建的。

对于我所看到的问题的解释,我有一条记录,其中包含许多详细记录。我的过滤器生成以下表达式(这是Expression.ToString()的输出):

Expression<Func<DB.record, bool>> filter = t => t.details
    .Where(d => (d.value== value(Filters.ContainsValueFilter).Value))
    .Any()

所以,首先执行查询就是为了得到记录数(对于我的分页):

context.records.Where(filter).Count();

这很好用。但是,当我进行下一个查询时,事情就会崩溃:

context.records.Where(filter)
    .OrderByDescending(t => t.transaction_time)
    .Skip(page * pageSize) //page and pageSize are ints
    .Take(pageSize)
    .ToList();

此查询会抛出NotImplementedException(在System.Data.Entity.Core.EntityCommandCompilationException内),此处出现:

at MySql.Data.Entity.SelectStatement.Accept(SqlFragmentVisitor visitor)
at MySql.Data.Entity.ExistsFragment.Accept(SqlFragmentVisitor visitor)
at MySql.Data.Entity.SqlGenerator.VisitAndReplaceTableName(SqlFragment sf, String oldTable, String newTable)
at MySql.Data.Entity.SqlGenerator.FuseSelectWithInnerSelect(SelectStatement outer, SelectStatement inner)
at MySql.Data.Entity.SqlGenerator.TryFusingSelect(InputFragment f)
at MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type)
at MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type)
at MySql.Data.Entity.SelectGenerator.Visit(DbLimitExpression expression)
at System.Data.Entity.Core.Common.CommandTrees.DbLimitExpression.Accept[TResultType](DbExpressionVisitor`1 visitor)
at MySql.Data.Entity.SqlGenerator.VisitInputExpression(DbExpression e, String name, TypeUsage type)
at MySql.Data.Entity.SelectGenerator.VisitInputExpressionEnsureSelect(DbExpression e, String name, TypeUsage type)
at MySql.Data.Entity.SelectGenerator.Visit(DbProjectExpression expression)
at System.Data.Entity.Core.Common.CommandTrees.DbProjectExpression.Accept[TResultType](DbExpressionVisitor`1 visitor)
at MySql.Data.Entity.SelectGenerator.GenerateSQL(DbCommandTree tree)
at MySql.Data.MySqlClient.MySqlProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree)
at System.Data.Entity.Core.Common.DbProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree, DbInterceptionContext interceptionContext, IDbDependencyResolver resolver, BridgeDataReaderFactory bridgeDataReaderFactory, ColumnMapFactory columnMapFactory)

我的问题:

是什么原因引起的?我有一个我一直在看的MySQL Connector / NET源代码的副本,我看到了:

internal override void Accept(SqlFragmentVisitor visitor)
{
  throw new System.NotImplementedException();
}

即使调用此方法,我做错了什么?为什么它无法处理AnyWhere的查询,然后执行OrderByDescendingSkipTake?这对我来说似乎是一个非常合理的查询(我可以很容易地写出SQL ... ORDER BY后跟LIMIT X,YWHERE包含EXISTS })。

这已经发生在我身上了很多,虽然我一般都找到了解决这个问题的方法(并且可能最终会再次在这里做同样的事情),当我需要执行时,我只会感到沮丧一个简单的查询(通常涉及Any内的Where)。

0 个答案:

没有答案