4

私の状況

いくつかのリストを含む ac# オブジェクトがあります。これらのリストの 1 つは、たとえば、c# の「SystemTag」オブジェクトのリストであるタグのリストです。このオブジェクトを最も効率的な方法でインスタンス化したいと考えています

私のデータベース構造には、次のテーブルがあります。

  • dbObject - 私の c# オブジェクトに関するいくつかの基本的な情報を含むテーブル
  • dbTags - 利用可能なすべてのタブのリスト
  • dbTagConnections - TagID と ObjectID の 2 つのフィールドを持つリスト (オブジェクトが複数のタグを持つことができるようにするため)

(私は他にもいくつかの同様のタイプのデータを持っています)

これが私が今やっている方法です...

  1. ID を使用して DB からオブジェクトを取得する
  2. DB オブジェクトを「オブジェクト ファクトリ」パターンに送信すると、タグ (およびその他のリスト) を取得する必要があることがわかります。次に、C# オブジェクトの ID を使用して DAL レイヤーに呼び出しを送信します。
  3. DAL レイヤーは DB からデータを取得します
  4. これらのデータは、タグに変換される「TagFactory」パターンに送信されます
  5. オブジェクト ファクトリに戻ります

これは非常に非効率的であり、データベースへの呼び出しが多数あります。私は4種類以上のリストを持っているので、これは特に問題を引き起こします。

私は何を試しましたか?

SQL はあまり得意ではありませんが、次のクエリを試してみました。

SELECT * FROM dbObject p
LEFT JOIN dbTagConnection c on p.Id=  c.PointId
LEFT JOIN dbTags t on c.TagId = t.dbTagId
WHERE ....

ただし、これはタグ接続と同じ数のオブジェクトを取得するため、結合はこれを行うための良い方法ではないと思います。

他の情報...

  • .NET Framework 4.0 の使用
  • LINQ to SQL を使用する (DAL オブジェクトから変換するための BLL の Factory パターンを含む BLL および DAL レイヤー)

...

それで、これをできるだけ効率的に解決するにはどうすればよいですか?:-) ありがとう!

4

4 に答える 4

1

エンティティ フレームワークの使用について考えたことはありますか? 次に、アプリケーション内の他のタイプのクラスと対話するのと同じ方法で、データベースと対話します。

セットアップは非常に簡単で、エンティティ デザイナーでデータベース テーブル間の関係を作成します。これにより、関連オブジェクトを呼び出すために必要なすべての外部キーが得られます。データベースにすべてのキーが設定されている場合、エンティティ デザイナーは代わりにこれらを使用します。すべてのオブジェクトの作成は、[データベースからモデルを作成] を選択するのと同じくらい簡単です。データベースに変更を加えるときは、デザイナーを選択し、「データベースからモデルを更新」を選択します

フレームワークがすべての SQL を処理してくれるので、心配する必要はありません。ほとんどの場合..

これを起動して実行するための優れた出発点は、ここここです

すべての設定が完了したら、LINQ を使用してデータベースに簡単にクエリを実行できます。

これは、テーブル アダプター ルートをたどるよりもはるかに効率的であることがわかります (現在それを行っていると仮定しますか?)。

私が何かを見逃していて、あなたがすでにこれを使っていたらごめんなさい.. :)

于 2012-09-24T13:50:27.860 に答える
1

Java/MSSQL サーバー/Plain JDBC を使用した以前のプロジェクトと同様の状況で、複数の結果セットを返すストアド プロシージャを使用しました。

ストアド プロシージャは、取得するオブジェクトに対応する ID を取得し、行を返してプライマリ オブジェクトを構築し、続いてプライマリ オブジェクトとの 1 対多の関係の複数のレコードを返します。これにより、1 回のデータベース インタラクションでオブジェクト全体を構築することができました。

于 2012-09-22T09:52:07.483 に答える
1

一見したところ、あなたの現在の働き方は「非効率的」とは思えません (提供された情報では)。コードを次のように置き換えます。

SELECT * FROM dbObject p
LEFT JOIN dbTagConnection c on p.Id=  c.PointId
LEFT JOIN dbTags t on c.TagId = t.dbTagId
WHERE ...

DAL メソッドを 2 回呼び出して、最初にオブジェクトのメイン データを取得し (1)、その後に関連するタグのデータのみを取得し (2)、ファクトリがオブジェクトのタグ リストを埋めることができるようにします。

(1)

SELECT * FROM dbObject WHERE Id=@objectId

(2)

SELECT t.* FROM dbTags t
INNER JOIN dbTag Connection c ON c.TagId = t.dbTagId
INNER JOIN dbObject p ON p.Id = c.PointId
WHERE p.Id=@objectId

多くのオブジェクトがあり、データの量がほんの少しである場合 (つまり、大きなボリュームを管理する予定がない場合)、私は ORM ベースのソリューションをEntity Framework.

私は(まだ)DBサーバーに送信されるすべてのクエリを制御できるように、DAOでSQLクエリを書くことに抵抗はありませんが、最終的には、私たちの状況ではそれが必要だからです。最初にオブジェクト データ ( SELECT * FROM dbObject WHERE ID=@myId) を回復するためにデータベースにクエリを実行し、オブジェクト インスタンスを入力し、次に DB に再度クエリを実行して、必要なすべての衛星データ (この場合はタグ) を回復する必要があることに不便はありません)。

特定のシナリオに対して有益な推奨事項を提供できるように、シナリオについてより簡潔に説明してください。とにかくこれがお役に立てば幸いです。

于 2012-09-25T12:58:37.323 に答える
0

私が推測する限り、データベースはすでに存在しており、SQLに精通しています。

petapocoのようなMicroORMを使用することをお勧めします。

これを使用するには、データベースにあるテーブルに一致するクラスを作成する必要があり(Visual Studio 2010でこれを自動的に実行するT4ジェネレーターがあります)、ラッパーを作成してよりリッチなビジネスオブジェクトを作成できます(ValueInjecterを使用してやってください、それは私が今まで使ったより簡単です)、またはあなたはそれらをそのまま使うことができます。

Petapocoは挿入/更新操作を処理し、生成されたIDを自動的に取得します。

Petapocoは複数の関係も処理するため、要件に適合しているようです。

于 2012-09-24T14:03:12.490 に答える