問題タブ [compiled-query]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linq-to-sql - Linq To Sql: コンパイル済みクエリと拡張メソッド
私は興味があります.Linq2SqlはIQueryableを返すコンパイル済みクエリをどのように処理しますか.
「GetEntitiesCompiled().Count()」や「GetEntitiesCompiled().Take(x)」などのコンパイル済みクエリに基づいて拡張メソッドを呼び出す場合。Linq2Sql はバックグラウンドで何をしますか? これは非常にまずいので、この状況では「CountEntitiesCompiled」のようなコンパイル済みクエリを作成する必要があります。
結果 (この場合は "GetEntitiesCompiled()") をメモリ ("ToList()" などのエンティティ クラスにマップ) にロードしますか?
したがって、コンパイルされたクエリが IQueryable を返す場合、そのクエリは Sql-Server へのリクエストの前に変更できないという意味があります。したがって、私の意見では、リストを返すこともできます。
答えてくれてありがとう!
.net - EntityFramework4のコンパイル時の単純なコンパイル済みクエリの内部例外
ソートされたテーブルから1ページを取得したい。並べ替えとページングをサーバーで実行したい。このために、次のコンパイル済みクエリを作成しました。
これは私には非常に簡単な質問のようです。ただし、次のステートメントで実行すると、次のようになります。
ソース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の最終リリースを使用しています。
ありがとう!
.net - コンパイルされたクエリでステートメントを切り替えることは可能ですか?
linq to entity / sqlのコンパイル済みクエリでswitchステートメントのようなものを使用することは可能ですか?たとえば、データベースから並べ替えられたレコードを返す場合、必要なプロパティごとに2つのコンパイル済みクエリ(昇順と降順)を記述するのではなく、1つのコンパイル済みクエリ内でスイッチのようなステートメントを使用してさまざまなプロパティで並べ替えたいと思います。並べ替えます。これは、単純な並べ替え可能なグリッドの場合でも、最大10個のコンパイル済みクエリになる可能性があります。
T-SQLでは、このような構造がほとんどのデータベースでサポートされていると想像するので、これはcaseステートメントで簡単になります。それで、なぜlinq/entityフレームワークでサポートされないのでしょうか。
これに対する解決策はありますか?
linq-to-sql - 結合およびコンパイルされたクエリでの LINQ-to-SQL "メンバー アクセスは型で正当ではありません" 例外
結合したい複数のクエリがあり、全体をコンパイルします。コンパイルされていないクエリは正常に実行されますが、「InvalidOperationException: 'UserQuery+Foo' のメンバー アクセス 'Int32 Id' は、タイプ 'System.Linq.IQueryable`1[UserQuery+Foo] では正当ではありません。」同じクエリをコンパイルして実行すると、例外がスローされます。
これを修正するにはどうすればよいですか?
編集
ユニオンとグループ化は無関係のようです。これらの要素をクエリから削除しても、コンパイル時に例外が発生します。
への呼び出しをGetA(dc)
withに置き換えdc.GetTable<Bar>()
て where 句を追加すると、問題が修正されます。
では、このように個別のクエリを一緒に接続することは、コンパイルされたクエリでは不可能ですか?
編集#2
ジェームズの答えは的を射ていた。クエリをさらに単純化すると、根本的な問題が明らかになります。
このクエリはスローしますNotSupportedException: Method 'System.Linq.IQueryable``1[UserQuery+Foo] GetA(System.Data.Linq.DataContext)' has no supported translation to SQL.
GetA への呼び出しを別の変数割り当てに引き出し、その変数をクエリで使用すると、InvalidOperationException: Sequence contains more than one element
例外がスローされます。
.net - コンパイルされたクエリを閉じるメソッド
.Where()
ご存知のとおり、またはのような句をコンパイル済みクエリに追加することはできません。これは.First()
、クエリが変更され、再コンパイルが強制されるためです。私が知りたいのは、コンパイルされたクエリを「閉じる」ためにどのメソッドを使用できるかということです。
.AsEnumerable()
ほとんどの人がまたはのいずれかを使用していることは知っています.ToList()
が、他のどの方法でも同様に機能しますか?使用できますか.AsQueryable()
、それともこれはノーオペレーションですか?
そして、パフォーマンスの面でどちらが優れていますか?私.AsEnumerable()
はより速いことを知っています.ToList()
、しかし私が欲しいならIQueryable
、.AsEnumerable().AsQueryable()
より良いです.ToList()
か?
.net - コンパイルされたクエリを使用する場合、ストアド プロシージャはまだ必要ですか?
エンティティ フレームワーク (または linq-to-sql) でコンパイルされたクエリを SQL Server と組み合わせて使用する場合、ストアド プロシージャを使用することで実際にパフォーマンス上の利点はありますか?
コンパイルされたクエリはパラメーター化されたクエリとしてキャッシュされるため、パフォーマンスはストアド プロシージャとほぼ同じになります。ストアド プロシージャのパフォーマンスが大幅に向上する状況はありますか?
- 編集 -
以下の Yakimych の回答に応えて、コンパイルされたクエリがストアド プロシージャと同じであることを意味するつもりはありませんでした。アプリケーション側で可能なすべての最適化を行った場合 (この場合はコンパイルされたクエリ)、sprocs がまだ必要かどうかを判断しようとしています。したがって、ストアド プロシージャが、アプリケーション側の最適化とパラメーター化されたクエリの組み合わせよりも優れている理由を探していると思います (これが、コンパイルされたクエリの効果です)。
私がこれを質問している理由の 1 つは、ストアド プロシージャがさまざまな理由 (つまり、この投稿)で不要になったと考えているように見える人が多いためです。
.net - コンパイル済みの LINQ クエリをリファクタリングするにはどうすればよいですか?
コンパイルされた LINQ to SQL クエリをリファクタリングすることは可能ですか? いくつかのロジックを含むクエリがあり、それに基づいて構築したいとします。そのクエリを再利用することは可能ですか?
たとえば、アクティブなアイテムを取得するための基本的なクエリがあるとします。
上記の式に基づいて、別のクエリを作成したいと思います。のドキュメントはCompiledQuery
、コンパイルされたデリゲートの結果に別の演算子を適用できないことを示しています。では、そのような式をリファクタリングするための推奨される方法は何ですか?
を使うべきだと思いますExpression
が、どのように使えばいいのでしょうか? それとももっと良い方法がありますか?
vb.net - LINQ でコンパイルされたクエリが実行されない - ArgumentNulException が処理されなかった
コンパイル済みクエリを初めてテストしています。
私の現在のクエリは次のとおりです。
しかし、ArgumentNulException が処理されませんでした。
LINQ クエリでは、必要なパラメーターを使用してオブジェクトを追加することをお勧めします。したがって、これはクラスです。
そして、完全にするために、これは私が受け取っているエラーです。
私は本当に解決策を見つけることができないようです:(
c# - CompiledQuery はいつ使用する必要がありますか?
私はテーブルを持っています:
次のメソッドを持つクラスがあります。
この場合、コンパイル済みクエリを使用する必要がありますか?
次に、私のGetByName
方法は次のようになります。
コードを生成しSELECT ID, Name FROM Tag
て実行Where
します。CompiledQuery
それともこの場合は避けるべきですか?
基本的に、コンパイル済みクエリをいつ使用する必要があるかを知りたいです。また、Web サイトでは、アプリケーション全体に対して 1 回だけコンパイルされますか?
c# - アプリケーションのライフサイクル中に、コンパイルされたクエリを何回再コンパイルする必要がありますか?
ウェブサイトで、クラスがある場合:
私が持っているページで:
クエリは何回コンパイルされますか?ページが読み込まれるたびに...?アプリケーションに入ったら...?