我有一个动态生成的查询,用于搜索相当大的记录集。我正在通过带有实体框架 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
,Skip
和Take
?对我来说,这似乎是一个非常合理的查询(我可以轻松写出 SQL……它的ORDER BY
后面是 aLIMIT X,Y
后面WHERE
包含一个EXISTS
)。
这在我身上发生了很多,虽然我通常已经找到了解决这个问题的方法(并且可能最终会再次在这里做同样的事情),但当我需要执行一个简单的查询时,我总是感到沮丧(通常涉及Any
内部 a Where
)。