3

我有一个动态生成的查询,用于搜索相当大的记录集。我正在通过带有实体框架 6 的 NuGet 包使用 MySQL 连接器/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(在 a 内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 连接器/NET 源代码的副本,我看到了这个:

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

我什至调用这个方法做错了什么?为什么它不能处理带有Any内部 a的查询Where,然后执行OrderByDescending,SkipTake?对我来说,这似乎是一个非常合理的查询(我可以轻松写出 SQL……它的ORDER BY后面是 aLIMIT X,Y后面WHERE包含一个EXISTS)。

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

4

0 回答 0