MySQL Connector/NET Any() внутри Where() вызывает NotImplementedException
У меня есть запрос, который динамически генерируется с целью поиска довольно большого набора записей. Я использую MySQL Connector/NET 6.8.3 через пакет NuGet с Entity Framework 6. 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
).