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).

0 ответов

Другие вопросы по тегам