10

現在、プロジェクトで LINQ to SQL を使用する際に問題が発生しています。これは、長い SQL クエリ (またはむしろビュー) のほとんどが C# にハードコードされているためであり、私たちがずっと行ってきたことは を使用することcontext.Database.SqlQuery<ClassName>(sql, sqlParams)です。

これは一般的に非常に効果的ですが、今はもっとダイナミックなものが必要です。.Where(x => x.Name.Contains("Anonymous")).Take(20)線に沿って、何か他のものをプラグインする必要があります。ただし、前述のコード行に直接プラグインすると、次のようになります。

context.Database.SqlQuery<ClassName>(sql, sqlParams).Where(x => x.Name.Contains("Anonymous")).Take(20);

実際には機能し、名前に「Anonymous」が含まれる上位 20 レコードをプルしますが、パフォーマンスはかなり悪いです。舞台裏で行われているのは、そのテーブルからすべてのレコードを取得し、それらをメモリにロードした後に最終的にフィルタリングすることです。

次に、テキスト SQL を LINQ に変換する方法、または LINQ を SQL に変換して、テキスト SQL と LINQ の両方を 1 つのステートメントで実行できるようにする方法はありますか。実際に解決策がない場合は、提案もいただければ幸いです...!

編集:式ツリーの使用を検討しましたが、実際にどのように図に収まるかはわかりません。また、データベース ビューの使用も検討しました。しかし、非常に多くのビュー (テーブルごとにかなりの数) があるため、すべてを MS SQL に移植し、すべてのクエリ ロジックを書き直すのは間違いなく面倒です。

4

5 に答える 5

8

式ツリーは動的に構築された式から SQL を生成するため、実際にはそれを行うことはできません。つまり、SQL を「コンパイル」できる式から SQL を生成します。

あなたの問題に対する私の提案は、SQLクエリを取得してデータベースにビューとして保存し、ビューをLINQ-To-SQL .dbmlファイルにマップし、その上にLINQクエリを追加することです。

context.viewSavedFromYourSql.Where(x => x.Name.Contains("Anonymous")).Take(20);

このようにして、LINQ はビューからクエリを実行し、必要なデータのみを返します。

(ビューの代わりにテーブル値関数を使用することもできます)

于 2012-11-14T08:37:54.003 に答える
2

[意見]

かなりの努力なしではありそうにありません。

あなたが求めているように見えるのは、sql -> sql モデルのトークナイザーまたは本格的な sql -> IQueryable トークナイザーのいずれかであり、どちらも実装に多大な労力がかかります。

私の提案は、大まかなSQLパーサーを作成して必要なステートメントを入れるか、ビューをLinqToDatabaseクエリとして書き直すことです。

IQueryable 式を作成するときの説明として、その式ツリーはクエリのオブジェクト ロジックであり、プロバイダーはそのロジックを取得して、実行する一連の SQL ステートメントと結果のマッパーにマップしようとします。反対のことを求めているように見えるので、一連の sql ステートメントを式ツリーに変換したいと思うでしょう。

これは、式ツリーにマップし、それに追加してからマップし直すという点で、少し二重の作業のように思えます。特に、完全なマップはおそらく不可能であるため、同等の結果が得られますが、期待した SQL が返されないことがわかります。

于 2012-11-06T11:25:40.173 に答える
2

Linkerをご覧になることをお勧めします。

SQL ステートメントを LINQ ステートメントに変換します。もちろん、すべての種類の SQL クエリを変換できるわけではありませんが、ハード コーディングされたすべての SQL クエリを LINQ ステートメントに変換したい場合には、大いに役立ちます。

無料じゃなかったらごめんなさい!

于 2012-11-14T07:44:41.130 に答える
1

クエリをストアドプロシージャに保存し、検索テキストをパラメータとして呼び出して呼び出すことはできませんか?プロシージャは、LINQ-To-SQLを介して呼び出すことができます。それはあなたにいくらかの時間を節約するはずです。

Simple / Complexプロシージャの呼び出しの詳細については、次のリンクを参照してください:http: //www.codeproject.com/Articles/230380/LINQ-to-SQL-Advanced-Concepts-and-Features

于 2012-11-14T08:47:14.643 に答える
1

Visual Studio で生成された SQL を表示するには、ブレークポイントを設定し、マウス カーソルを変数に移動します (linq クエリは .ToList() または ToArray() で終了しないでください)、またはこのメソッドを使用します。. SQL を linq に変換するには、http ://www.sqltolinq.com/ を参照してください。

高速で高品質のストアド プロシージャを作成し、それをデータ コンテキストに追加して、linq クエリで使用できます。

于 2012-11-18T21:46:22.293 に答える