Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态LINQ groupby并从ADO datatable和return datatable中选择列_Linq_Dynamic - Fatal编程技术网

动态LINQ groupby并从ADO datatable和return datatable中选择列

动态LINQ groupby并从ADO datatable和return datatable中选择列,linq,dynamic,Linq,Dynamic,我有一个ADO数据表,如下所示 tname cname rgname schools mtext tn1 cn1 rg1 1 mxt1 tn1 cn1 rg1 2 mxt1 tn1 cn1 rg1 3 mxt1 tn2 cn2 rg2 5 mxt2 tn2 cn2 rg2 8 mxt2 tn2 cn2

我有一个ADO数据表,如下所示

tname   cname   rgname  schools mtext
tn1     cn1      rg1     1      mxt1
tn1     cn1      rg1     2      mxt1
tn1     cn1      rg1     3      mxt1
tn2     cn2      rg2     5      mxt2
tn2     cn2      rg2     8      mxt2
tn2     cn2      rg2     3      mxt2
tn3     cn1      rg1     7      mxt1
tn3     cn1      rg1     4      mxt1
我想通过以逗号分隔的方式分组和连接学校,从上面的表生成一个表。结果应该是这样的

tname   cname   rgname  schools mtext
tn1     cn1     rg1     1,2,3   mxt1
tn2     cn2     rg2     5,8,3   mxt2
tn3     cn1     rg1     7,4     mxt1
我只知道在运行时按列分组。我还希望将结果作为类似的数据表,因为有更多的列到15。S是否可以使用动态分组方式并选择lambda表达式

我已经实现了动态分组的逻辑,但是动态选择让我很困扰

    var result = from o in DT.AsEnumerable()
         group o by new
         {
           cname = groupByCname? o.Field<string>("cname") : null,
           tname = groupByTname? o.Field<string>("tname") : null,
           rgname = groupByRGname? o.Field<string>("rgname") : null,
           mtext = groupByMtext? o.Field<string>("mtext") : null,
         } into g
       select new
        {
        //Here i want to select all columns from DT and have schools as
        // comma separated
         schools = String.Join(",",g.Select(x=>x.Field<string>  ("Schools")).ToArray())
       };

感谢您的帮助

我已对您的代码进行了一些修改。这可能不是最好的方法,但它确实能满足您的需要

var result = from row in
        (from t in
            (from o in dt.AsEnumerable()
             join u in dt.AsEnumerable()
             on o.Field<string>("tname") equals u.Field<string>("tname")
             select new
             {
                 o,
                 u = String.Join(",", u.Field<string>("schools"))
              })
              group t by new
              {
                  tname = t.o.Field<string>("tname"),
                  cname = t.o.Field<string>("cname"),
                  rgname = t.o.Field<string>("rgname"),
                  mtext = t.o.Field<string>("mtext")
              } into gcs
              select new
              {
                  rows = gcs.Select(x => x.o).First(),
                  schools = gcs.Select(x => x.u).Take(gcs.Key.tname.Count())
              })
    select row;

DataTable resultTable = new DataTable();
resultTable = dt.Clone();

foreach (var item in result)
{
    DataRow row = resultTable.NewRow();

    for (int i = 0; i < item.rows.ItemArray.Length; i++)
    {
        if (row.Table.Columns[i].ToString() == "schools")
        {
            row[i] = string.Join(", ", item.schools.ToList());
        }
        else
        {
            row[i] = item.rows.ItemArray[i];
        }
    }

    resultTable.Rows.Add(row);
}

谢谢你的回复。“按列分组”也是动态的,我处理“按列分组”的方式是否错误?我的意思是,有时group by列将仅为tname,rgname。这很接近:事实上,您自己的代码对我来说也很好。上面所说的是一个参数,但我有可能使用多个group by。所以可能是上面的链接不起作用。