で1対多のテーブルのリレーションシップに基づいてオブジェクトを取り込み他の1つのウィジェットのために多くのレコードを保持している、のは、ウィジェットの好きな数字を言ってみましょう:私はこのようなC#でオブジェクトを持っているSQL
widgets
-----------
id (int, not null)
// other properties ...
widget_nums
----------
widget_id (int, not null)
num (int)
私は自分自身が頻繁に私はちょうど1クエリを作成するテーブルを結合することができます知っているにもかかわらず、このオブジェクトを移入するには、2つのSQLクエリを実行見つけます。その理由は、データが重複している結果セットを繰り返し処理するのではなく、必要なデータだけをオブジェクトに取り込むほうが簡単に思えるからです。もちろん、このウィジェットの例は実際のシナリオに比べて大幅に単純化されています。ここにその例があります:
int WidgetID = 8;
ClassWidget MyWidget = new ClassWidget();
using (SqlConnection conn = GetSQLConnection())
{
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = @"SELECT id FROM widgets WHERE id = @WidgetID;";
cmd.Parameters.AddWithValue("WidgetID", WidgetID);
using (SqlDataReader Reader = cmd.ExecuteReader())
{
if (Reader.HasRows)
MyWidget.ID = GetDBInt("id", Reader); // custom method to read database result
}
cmd.CommandText = @"SELECT num FROM widget_nums WHERE widget_id = @WidgetID;";
using (SqlDataReader Reader = cmd.ExecuteReader())
{
if (Reader.HasRows)
while (Reader.Read())
MyWidget.WidgetFavoriteNumbers.Add(GetDBInt("num", Reader));
}
conn.Close();
}
}
私の質問は、このタイプのアプローチを使用し続けるべきかどうか、またはテーブル結合を実行することが推奨されるかどうかです。テーブルジョインが推奨されている場合、オブジェクトを生成するための最良のデザインパターンは何ですか?私の問題は、重複行を除外するためにロジックを作成しなければならず、ウィジェットだけではなくすべてのウィジェットを取得しているときに特に複雑になります。
を私はORMのアイデアを愛していますが、それが意味するものではありませんデバッグ時:次に、以下のようあなたの方法を書き換え、複数のウィジェットと、そのwidget_nums
を照会するとき、あなたも、この方法を使用することができますデータレイヤーを完全には知らないので、デバッグのためにそれを横断することになります。 – Coops
申し訳ありませんが、私はあなたが意味するものを得ていませんでしたか? –
私は経験は限られていますが、データプロバイダを使用するのではなく、独自のデータレイヤをコーディングした方がデバッグがずっと楽だと思いますか? – Coops