2

ソートされたテーブルから1ページを取得したい。並べ替えとページングをサーバーで実行したい。このために、次のコンパイル済みクエリを作成しました。

internal static readonly Func<MyEntities, string, int, int, IQueryable<Model.Message>> MessagesPagedSortedByDateQuery =
        CompiledQuery.Compile((MyEntities db, string folderId, int pageSize, int pageIndex) =>
        (
            db.Messages.Where(m => m.FolderId == folderId).OrderBy(m => m.Date).Skip(pageSize * pageIndex).Take(pageSize)
        ));

これは私には非常に簡単な質問のようです。ただし、次のステートメントで実行すると、次のようになります。

var messages = MessageCompiledQueries.MessagesPagedSortedByDateQuery(myEntities, folderId, pageSize, pageIndex).ToList();

ソースSystem.Data.Entityから次の例外が発生します。

カウントは、DbConstantExpressionまたはDbParameterReferenceExpressionである必要があります。パラメータ名:カウント

このスタックトレースを使用すると:

System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateSkip(DbExpressionBinding input、IEnumerable'1 sortOrder、DbExpression count)at System.Data.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.Skip(DbExpressionBinding input、IEnumerable'1 sortOrder 、DbExpression count)at System.Data.Objects.ELinq.ExpressionConverter.OrderByLifter.ApplySortOrderToSkip(DbExpression input、DbSortExpression sort、DbExpression k)at System.Data.Objects.ELinq.ExpressionConverter.OrderByLifter.SortLifter.Skip(D System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SkipTranslator.TranslatePagingOperator(ExpressionConverter親、DbExpressionオペランド、System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.PagingTranslator.TranslateUnary(ExpressionConverter親、DbExpressionオペランド、MethodCallExpression呼び出し)at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConvert呼び出し)at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent、MethodCallExpression call、SequenceMethod sequenceMethod)at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent、MethodCallExpression linq)at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator'1.Translate(ExpressionConverter parent、System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent、MethodCallExpression call)atSystem.Data.Objects.ELinq。 .ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent、MethodCallExpression call、SequenceMethod sequenceMethod)at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent、MethodCallExpression linq)atSystem.Data.Objects.ELinq.Express。 System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)のTypedTranslator'1.Translate(ExpressionConverter parent、Expression linq)。System.Data.Objects.ELinq.CompiledELinqQueryState.GetExecutionPlan(Nullable'1 forMergeOption)at System.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption)atSystemのData.Objects.ELinq.ExpressionConverter.Convert() Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator()at System.Collections.Generic.List'1..ctor(IEnumerable'1 collection)at System.Linq.Enumerable.ToList [TSource]( IEnumerable'1 source)at MyApp.Data.Repository.MessageRepository.GetByFolder(String folderId、Int32 pageSize、Int32 pageIndex、String sortField)in C:\ Projects \ MyApp \ MyApp.Data \ Repository \ MessageRepository.cs:line 40 at MyApp C:\ Projects \ MyApp \ MyAppの.WebClient.Controllers.FolderController.Messages(GridCommand command、String folderId)。WebClient \ Controllers \ FolderController.cs:line 53 at lambda_method(Closure、ControllerBase、Object [])at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller、Object [] parameters)at System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext、IDictionary`2 parameters)at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary'2 parameters)at System.Web.Mvc.ControllerActionInvoker。<>c__DisplayClassd.b__a()atSystem。 Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func'1 continuation)Execute(ControllerBase controller、Object [] parameters)at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary`2 parameters)at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary'2 parameters )atSystem.Web.Mvc.ControllerActionInvoker。<>c__DisplayClassd.b__a()at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func'1 continuation)Execute(ControllerBase controller、Object [] parameters)at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary`2 parameters)at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary'2 parameters )atSystem.Web.Mvc.ControllerActionInvoker。<>c__DisplayClassd.b__a()at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func'1 continuation)ActionDescriptor actionDescriptor、IDictionary'2 parameters)atSystem.Web.Mvc.ControllerActionInvoker。<>c__DisplayClassd.b__a()at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func'1 continuation)ActionDescriptor actionDescriptor、IDictionary'2 parameters)atSystem.Web.Mvc.ControllerActionInvoker。<>c__DisplayClassd.b__a()at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func'1 continuation)

クエリを初めてコンパイルするときに例外が発生するようです。クエリからorderbyを削除すると、問題なく機能します。しかし、明らかにサーバー上で順序付けとページングを実行したいので、テーブル全体を取得した後でそれを実行したくありません。これはエンティティフレームワークのバグですか?私はそれについて何もウェブ上で見つけることができません。誰かがこれを回避する方法を知っていますか?VisualStudio2010で.NetFramework4の最終リリースを使用しています。

ありがとう!

4

1 に答える 1

2

これで問題が解決するかどうかを確認してください:

internal static readonly Func<MyEntities, string, int, int, int, IQueryable<Model.Message>> 
    MessagesPagedSortedByDateQuery =
        CompiledQuery.Compile((MyEntities db, string folderId, int pageSize, int pageIndex, int skipCount) =>
        (
            db.Messages.Where(m => m.FolderId == folderId).OrderBy(m => m.Date).Skip(skipCount).Take(pageSize)
        ));

署名を変更したことに注意してください。これは明らかに理想的な解決策ではありませんが、コードのコンテキストでこれをどのように使用しているかはわかりません。エラーを回避できる場合は、より便利なものに微調整できます。

于 2010-06-02T12:47:15.087 に答える