我有一个动态生成的查询,用于搜索相当大的记录集。我通过带有实体框架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();
}
即使调用此方法,我做错了什么?为什么它无法处理Any
内Where
的查询,然后执行OrderByDescending
,Skip
和Take
?这对我来说似乎是一个非常合理的查询(我可以很容易地写出SQL ... ORDER BY
后跟LIMIT X,Y
后WHERE
包含EXISTS
})。
这已经发生在我身上了很多,虽然我一般都找到了解决这个问题的方法(并且可能最终会再次在这里做同样的事情),当我需要执行时,我只会感到沮丧一个简单的查询(通常涉及Any
内的Where
)。