16

次のシナリオの設計に関するアドバイスを探しています。

コードファーストの EF5 MVC アプリケーションがあります。多くのテーブルから複数の加重列を組み込む全文検索機能を構築しています。これらのテーブルからインデックスを使用してビューを作成できないため (一部のテーブルにはテキスト/バイナリ列が含まれています)、オブジェクトの ID (例: PersonID) とそのオブジェクトに関連付けられたランクを出力するストアド プロシージャを作成しました。検索ワード。

私の現在のアプローチは、ストアド プロシージャを呼び出し、返された ID に基づいてコンテキストからすべてのオブジェクトをロードする全文検索を実行するためのヘルパー クラスを作成することです。

私の質問は次のとおりです。

  1. 私のアプローチは理にかなっているように見えますか、合理的なベストプラクティスに従っていますか?
  2. 他の誰かが学んだ教訓で同様のことをしましたか?
  3. これをより効率的に行う方法はありますか (つまり、追加のルックアップを必要とせずに、ストアド プロシージャの結果をエンティティに直接返す/マップする方法はありますか?)

アップデート

私の詳細な実装を質問の編集から独自の回答に移動して、@ meta.stackexchange.com で頻繁に推奨されるものとより一致させました。

4

2 に答える 2

13
  1. アプリケーションの残りの部分が使用している可能性のあるエンティティフレームワークコードでcontainstableのようなSQLメソッドを最初に使用できないため、記述のようなstoredprocedureで何かを「強制」される可能性があります。それがベストプラクティスかどうかはわかりません。しかし、それは仕事を成し遂げます。なぜそれが賢明ではないのかわかりません。
  2. はい - 私は EF コードファーストを中心としたプロジェクト ビルドに取り組んでおり、「必須」とマークされたいくつかの検索パラメータと「あると便利」とマークされたいくつかの値を含むかなり複雑な検索を実行する必要がありました。加重結果。
  3. 結果セットの複雑さにもよりますが、データベースへの 2 回目のラウンドトリップを行う必要はないと思います。以下に、私が行ってきた方法を示します。

以下は単なる例であることに注意してください。

    public List<Person> GetPeople(params string[] p)
    {
        var people = new List<Person>();

        using (var db = new DataContext())
        {
            var context = ((IObjectContextAdapter)db).ObjectContext;

            db.Database.Connection.Open();

            var command = db.Database.Connection.CreateCommand();
            command.CommandText = "SomeStoredProcedureReturningWeightedResultSetOfPeople";
            command.CommandType = System.Data.CommandType.StoredProcedure;

            //Add parameters to command object

            people = context.Translate<Person>(command.ExecuteReader()).ToList();
        }

        return people;
    }

ストアドプロシージャには重み値の列がありますが、変換時にマップされません。必要に応じて、重み値を含む Person からクラスを派生させることができます。

于 2013-01-09T22:17:39.103 に答える