2

これが私の現在の関係です

DataRelation relation = new DataRelation("EventCategoryRelation", eventsTable.Columns["event_id"], eventCategoriesTable.Columns["event_id"]);
ds.Tables.Add(eventsTable);
ds.Tables.Add(eventCategoriesTable);
ds.Relations.Add(relation);

ここで表を簡単に見てみましょう

イベントテーブル

event_id | event_description

1 || "First Event"

EventCategories テーブル

event_category_id || event_id || category_id

1 || 1 || 1

2 || 1 || 2

関係は多対多(1 つのイベントが多カテゴリ)

foreach ループを使用して DTO を設定する方法を次に示します。

foreach (DataRow row in eventsTable.Rows)
{
    Event events = new Events();

    events.Description = row["event_description"].ToString();

    DataRow[] aDr = row.GetChildRows("EventCategoryRelation");
    foreach (DataRow dr in aDr)
    {
        Categories category = new Categories();
        category.CategoryID = Int64.Parse(dr["category_id"].ToString());

        events.CategoryList.Add(category);
    }
}

実際のコードにはさらに多くのフィールドがあります。foreach ループを LINQ クエリに置き換えたい。それは可能ですか?

4

1 に答える 1

4

つまり、基本的に各 DataRow を Categories オブジェクトに変換し、それらをイベントに追加していますか? この種のことは、Linq Select を使用して実現できます (これは射影と呼ばれます)。

カテゴリのリストを作成するには ...

DataRow[] aDr = row.GetChildRows("EventCategoryRelation");
var categoryList = aDr.Select(row => new Categories()
                              {
                                 category.CategoryID = Int64.Parse(dr["category_id"].ToString());
                              });

// add them to your event
events.CategoryList.AddRange(categoryList);

// or ...
events.CategoryList = categoryList.ToList();

カテゴリをイベントに追加する最後の手順は、CategoryList の種類、AddRange メソッドがあるかどうか、またはそれを新しいコレクションまたはカテゴリのリストに設定できるかどうかによって異なります。

次に、次のように外側の for-each を組み合わせることができます。

var eventsList = eventsTable.AsEnumerable().Select(eventRow => new Events()
  {
     Description = eventRow["event_description"].ToString(),
     CategoryList = eventRow.GetChildRows("EventCategoryRelation")
                            .Select(row => new Categories()
                              {
                                 category.CategoryID = Int64.Parse(row["category_id"].ToString());
                              })
                            .ToList()
  }

これは、DataTable で次の拡張メソッドを使用することに注意してください。

http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

于 2011-01-21T08:43:27.720 に答える