如何在数据表字段上执行分组,关系定义在2个数据表之间?

时间:2016-08-08 15:55:37

标签: c# linq datatable

我在数据集

中有2个数据表,其中包含以下记录

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.

3 个答案:

答案 0 :(得分: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中的所有信息,您可以使用此查询来获取它。

答案 1 :(得分:1)

这个东西是linq为...而建的......

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

答案 2 :(得分:1)

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

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();