かなり大きなレコード セットを検索する目的で動的に生成されるクエリがあります。Entity Framework 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
このクエリは、次の場所で発生する(内の 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 Connector/NET ソース コードのコピーを持っていて、次のように表示されます。
internal override void Accept(SqlFragmentVisitor visitor)
{
throw new System.NotImplementedException();
}
このメソッドを呼び出すのに何が間違っていますか? Any
内部に aWhere
があるクエリを処理できないのはなぜOrderByDescending
ですか? それは私にとって完全に合理的なクエリのように思えます (そして、SQL を簡単に書き出すことができました...の後にを含む の後にが続きます)。Skip
Take
ORDER BY
LIMIT X,Y
WHERE
EXISTS
これは私にかなりの頻度で発生し、一般的にこれを回避する方法を見つけましたが(おそらくここでも同じことをすることになるでしょう)、単純なクエリを実行する必要があるときに常にこれに遭遇することに不満を感じています(通常、Any
a の内側に含まれますWhere
)。