如何对具有2个数据表之间关系定义的数据表字段执行分组

本文关键字:数据表 定义 字段 执行 关系 之间 2个 | 更新日期: 2023-09-27 18:01:15

我有两个数据表,在数据集中有以下记录

dtVariant:

Name        Type        status
Variant1    Add          active
Variant2    Division     active

dtSubVariant:

Name       Type           SubvariantName 
Variant1    Add            Sub1
Variant1    Add            Sub2
Variant1    Add            Sub3
Variant2    Division       Sub1
Variant2    Division       Sub2
Variant2    Division       sub3
Variant2    Division       sub4

现在,我想获得按变体类型列出的子变体列表,并且只获得那些状态为活动的变体,如下所示:

Add:Sub1,Sub2,Sub3
Division:Sub1,Sub2,Sub3,Sub4

在这里,我在这两个数据表之间建立了列Name and Type之间的关系,如下所示:

Ds1.Relations.Add("MyRelation", dtVariant, dtSubVariant, false);

查询

var data = (from c in Ds1.Tables["dtVariant"].AsEnumerable()
   .where c.Field<string>("status")=="active"
           group c by new { Type = c.Field<string>("Type") } into grp       
           select new
           {
                 Type= grp.Key.Type,
                  Names=
               from dp in c.GetChildRows("MyRelation")//Not getting this method
           }).ToList();

但当我尝试这样做时:

from dp in c.GetChildRows("MyRelation") //i am not getting this GetChildRows method.

如何对具有2个数据表之间关系定义的数据表字段执行分组

var result = Ds1.Tables["dtSubVariant"].AsEnumerable()
             .GroupBy(i => i.Type)
             .select(x=>new
                   {
                    Type= i.Key.Type,
                    SubVariantList=i.Select(x=>x.SubvariantName).ToArray()
                   }).ToList();

您在dtSubVariant中拥有所有信息,可以使用此查询来获取。

这个东西就是linq构建的目的。。。

var result = Ds1.Tables["dtVariant"].AsEnumerable().GroupBy(i => i.Type);

您似乎没有正确设置关系,但如果没有它,可能会更快:

string[] activeTypes = Ds1.Tables["dtVariant"].Rows.Cast<DataRow>()
    .Where(r => r["status"] == "active").Select(r => r["Type"] + "").ToArray();
var data = Ds1.Tables["dtSubVariant"].Rows.Cast<DataRow>()
    .GroupBy(r => r["Type"] + "")
    .Where(g => activeTypes.Contains(g.Key))
    .Select(g => new { 
        Type = g.Key,
        Names = g.ToList()
    }).ToList();