【问题标题】:DataSet select parent rows where child rows contains x value数据集选择子行包含 x 值的父行
【发布时间】:2012-02-11 15:39:47
【问题描述】:

我在DataSet 中有两个DataTables 通过DataRelation 链接在一起,我正在尝试选择所有具有值为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"]));

编辑

我已经拼凑出这段 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;

【问题讨论】:

  • 如果您的答案适合您,请随意回答您自己的问题。
  • 它有效,但是当已经存在关系时必须重新创建关系似乎有点愚蠢。

标签: c# linq dataset datarelation


【解决方案1】:

试试:

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匹配,您就会得到您想要的结果。

【讨论】:

  • 这将带回所有具有该 entity_id 的产品。我正在寻找仅属于特定类别的一组产品
【解决方案2】:
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
}

【讨论】:

  • 不应该是子行的类别DataRow[] childRows = dsProducts.Tables["categories"],关系应该是entity_id
猜你喜欢
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2017-06-11
  • 2011-12-20
相关资源
最近更新 更多