2012-01-16 2 views
2

У меня есть два DataTables в DataSet, связанный вместе DataRelation, и я пытаюсь выбрать все родительские строки, у которых есть дочерняя строка со значением x.DataSet выбрать родительские строки, где дочерние строки содержат значение x

Родительская таблица содержит продукты и дочерняя таблица содержит категории, что продукт находится в.

DataSet dsProducts = new DataSet(); 

DataTable dtProducts = new DataTable("products"); 
dtProducts.Columns.Add("entity_id", typeof(int)); 
dtProducts.Columns.Add("sku", typeof(string)); 
dtProducts.Columns.Add("mpn", typeof(string)); 
dtProducts.Columns.Add("brand", typeof(string)); 
dtProducts.Columns.Add("name", typeof(string)); 
dtProducts.Columns.Add("description", typeof(string)); 
dtProducts.Columns.Add("short_description", typeof(string)); 
dtProducts.Columns.Add("image", typeof(string)); 
dtProducts.Columns.Add("weight", typeof(double)); 
dtProducts.Columns.Add("qty", typeof(double)); 
dtProducts.Columns.Add("cost", typeof(double)); 
dtProducts.Columns.Add("price", typeof(double)); 
dtProducts.PrimaryKey = new DataColumn[] { dtProducts.Columns["entity_id"] }; 
dsProducts.Tables.Add(dtProducts); 

DataTable dtCategories = new DataTable("categories"); 
dtCategories.Columns.Add("entity_id", typeof(int)); 
dtCategories.Columns.Add("category_id", typeof(int)); 
dsProducts.Tables.Add(dtCategories); 

dsProducts.Relations.Add(new DataRelation("entity_id", dtProducts.Columns["entity_id"], dtCategories.Columns["entity_id"])); 

EDIT

Я кусочки этого кусок Linq кода, который работает но представляется бессмысленным наличие DataRelation

var rows = from prods in dsProducts.Tables["products"].AsEnumerable() 
      join cats in dsProducts.Tables["categories"].AsEnumerable() on prods.Field<int>("entity_id") equals cats.Field<int>("entity_id") 
      where cats.Field<int>("category_id") == id 
      select prods; 
+0

Не стесняйтесь отвечать на свой вопрос, если ваш ответ работает на вас. –

+0

это работает, но кажется немного глупым, чтобы восстановить отношение, когда там уже есть отношение. – Christian

ответ

1

Try:

DataRow[] rows = dsProducts.Tables["products"].Select("entity_id=" + id); 

вместо:

DataRow[] rows = dsProducts.Tables["products"].Select("Child(entity_id).category_id = " + id); 

Поскольку вы уже создать связь между двумя таблицы с общей колонке «ENTITY_ID», так до тех пор, как вы ENTITY_ID подобран, вы получите желаемый результат ,

+0

, который вернет все продукты с этим entity_id. Im ищет набор строк, которые находятся только в определенной категории. – Christian

0
DataRelation relation = dsProducts.Relations.Add(new DataRelation("entity_id", dtProducts.Columns["entity_id"], dtCategories.Columns["entity_id"])); 

DataRow[] childRows = dsProducts.Tables["categories"].Select("category_id=" + id); 
foreach (DataRow row in childRows) { 
    DataRow[] parentRows = row.GetParentRows(relation); // parentRows[0] should be your parent 
} 
+0

. Не должно быть категорий для childrows. DataRow [] childRows = dsProducts.Tables ["categories"] 'и отношение должно быть' entity_id' – Christian

+0

@Christian: Вы верный. Исправлена. –

Смежные вопросы