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
使用动态GroupBy子句实现Linq_Linq - Fatal编程技术网

使用动态GroupBy子句实现Linq

使用动态GroupBy子句实现Linq,linq,Linq,在下面的Linq语句中,我在尝试获取数据表字段(如“ID”)并将其分配给行[“ID”]时遇到了“Select”错误 //行[“ID”]=g.Field(“ID”); 错误消息: System.Linq.IGrouping不包含“字段”的定义 var x=groupedDataRow .可计算的() .选择(g=> { var row=dataTable.NewRow(); //行[“ID”]=g.Field(“ID”); 行[“金额”]=g.Sum(r=>r.Field(“金额”); 行[“百

在下面的Linq语句中,我在尝试获取数据表字段(如“ID”)并将其分配给行[“ID”]时遇到了“Select”错误

//行[“ID”]=g.Field(“ID”);
错误消息:

System.Linq.IGrouping
不包含“字段”的定义

var x=groupedDataRow
.可计算的()
.选择(g=>
{
var row=dataTable.NewRow();
//行[“ID”]=g.Field(“ID”);
行[“金额”]=g.Sum(r=>r.Field(“金额”);
行[“百分比”]=g.Sum(r=>r.Field(“百分比”);
返回行;
}).CopyToDataTable();
如何检索像“ID”这样的数据表字段,以便将其分配给Select语句中的行[“ID”]

Linq示例

 public class Program
 {
    static StringBuilder stringBuilder = new StringBuilder();
    public static String GroupData(DataRow dataRow)
    {
        String[] columnNames = new[] {"ID","COL1", "COL2"};
        stringBuilder.Remove(0, stringBuilder.Length);
        foreach (String column in columnNames)
        {
            stringBuilder.Append(dataRow[column].ToString());
        }
        return stringBuilder.ToString();
    }

    public static void Main()
    {
         DataTable dataTable = new DataTable("MyTable");

        DataColumn dc2 = dataTable.Columns.Add("ID", typeof(decimal));  
        dataTable.Columns.Add("AMT", typeof(decimal));  
        dataTable.Columns.Add("PERCENTAGE", typeof(decimal));  
        dataTable.Columns.Add("COL1", typeof(String));  
         dataTable.Columns.Add("COL2", typeof(String));

        dataTable.Rows.Add(000, 400,100,"sss","vvv");  
        dataTable.Rows.Add(888, 400, 100,"qqq","fff");  
        dataTable.Rows.Add(000, 300, 100,"eee","aaa");  
        dataTable.Rows.Add(000, 300, 100,"eee","aaa");  
        dataTable.Rows.Add(000,400,100,"sss","vvv");  




         EnumerableDataRowList<DataRow> enumerableRowCollection = new EnumerableDataRowList<DataRow>(dataTable.Rows);

        Func<DataRow, String> groupingFunction = GroupData;
        var groupedDataRow = enumerableRowCollection.GroupBy(groupingFunction);

        var x = groupedDataRow.AsEnumerable()
                .Select(g =>
                        {
                            var row = dataTable.NewRow();
                            //row["ID"] =  g.Field<decimal>("ID");
                            row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
                            row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
                            return row;
                        }).CopyToDataTable();


        foreach(DataRow row in x.Rows)
        {
            Console.WriteLine(row["ID"].ToString() + " " + row["COL1"].ToString() + " " + row["COL2"].ToString() + " " + row["AMT"].ToString() + " " + row["PERCENTAGE"].ToString()) ;
        }
    }


class EnumerableDataRowList<T> : IEnumerable<T>, IEnumerable
{
    IEnumerable dataRows;
    internal EnumerableDataRowList(IEnumerable items)
    {
        dataRows = items;
    }
    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        foreach (T dataRow in dataRows)
            yield return dataRow;
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        IEnumerable<T> iEnumerable = this;
        return iEnumerable.GetEnumerator();
    }
}
公共类程序
{
静态StringBuilder StringBuilder=新StringBuilder();
公共静态字符串GroupData(DataRow DataRow)
{
String[]columnNames=new[]{“ID”、“COL1”、“COL2”};
stringBuilder.Remove(0,stringBuilder.Length);
foreach(columnNames中的字符串列)
{
追加(dataRow[column].ToString());
}
返回stringBuilder.ToString();
}
公共静态void Main()
{
DataTable=新的DataTable(“MyTable”);
DataColumn dc2=dataTable.Columns.Add(“ID”,typeof(decimal));
dataTable.Columns.Add(“AMT”,typeof(decimal));
dataTable.Columns.Add(“百分比”,typeof(十进制));
dataTable.Columns.Add(“COL1”,typeof(String));
dataTable.Columns.Add(“COL2”,typeof(String));
添加(000400100,“sss”,“vvv”);
添加(888400100,“qqq”,“fff”);
添加(000300100,“eee”,“aaa”);
添加(000300100,“eee”,“aaa”);
添加(000400100,“sss”、“vvv”);
EnumerableDataRowList enumerableRowCollection=新的EnumerableDataRowList(dataTable.Rows);
Func groupingFunction=GroupData;
var groupedDataRow=EnumerablerRowCollection.GroupBy(groupingFunction);
var x=groupedDataRow.AsEnumerable()
.选择(g=>
{
var row=dataTable.NewRow();
//行[“ID”]=g.Field(“ID”);
行[“金额”]=g.Sum(r=>r.Field(“金额”);
行[“百分比”]=g.Sum(r=>r.Field(“百分比”);
返回行;
}).CopyToDataTable();
foreach(x.Rows中的数据行)
{
Console.WriteLine(行[“ID”].ToString()+“”+行[“COL1”]。ToString()+“”+行[“COL2”]。ToString()+“”+行[“金额”]。ToString()+“”+行[“百分比”]。ToString());
}
}
类EnumerableDataRowList:IEnumerable,IEnumerable
{
IEnumerable数据行;
内部可枚举数据行列表(IEnumerable项)
{
数据行=项目;
}
IEnumerator IEnumerable.GetEnumerator()
{
foreach(数据行中的T数据行)
产生返回数据行;
}
IEnumerator IEnumerable.GetEnumerator()
{
IEnumerable IEnumerable=这个;
返回iEnumerable.GetEnumerator();
}
}

这是因为
g
是一个
i分组
,它没有
字段
成员

您可以尝试以下方式:

  var x = groupedDataRow.AsEnumerable()
          .Select(g =>
          {
            var row = dataTable.NewRow();
            row["ID"] = g.Select(r => r.Field<decimal>("ID")).FirstOrDefault();
            row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
            row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
            return row;
          }).CopyToDataTable();
var x=groupedDataRow.AsEnumerable()
.选择(g=>
{
var row=dataTable.NewRow();
行[“ID”]=g.Select(r=>r.Field(“ID”)).FirstOrDefault();
行[“金额”]=g.Sum(r=>r.Field(“金额”);
行[“百分比”]=g.Sum(r=>r.Field(“百分比”);
返回行;
}).CopyToDataTable();

var x=groupedDataRow.AsEnumerable()
.选择(g=>
{
var row=dataTable.NewRow();
行[“ID”]=g.First().字段(“ID”);
行[“金额”]=g.Sum(r=>r.Field(“金额”);
行[“百分比”]=g.Sum(r=>r.Field(“百分比”);
返回行;
}).CopyToDataTable();

使用
g.First()
应该是安全的,因为一个组只有在包含任何项目时才是一个组。

这是因为
g
是一个
i分组
,它没有
字段
成员

您可以尝试以下方式:

  var x = groupedDataRow.AsEnumerable()
          .Select(g =>
          {
            var row = dataTable.NewRow();
            row["ID"] = g.Select(r => r.Field<decimal>("ID")).FirstOrDefault();
            row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
            row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
            return row;
          }).CopyToDataTable();
var x=groupedDataRow.AsEnumerable()
.选择(g=>
{
var row=dataTable.NewRow();
行[“ID”]=g.Select(r=>r.Field(“ID”)).FirstOrDefault();
行[“金额”]=g.Sum(r=>r.Field(“金额”);
行[“百分比”]=g.Sum(r=>r.Field(“百分比”);
返回行;
}).CopyToDataTable();

var x=groupedDataRow.AsEnumerable()
.选择(g=>
{
var row=dataTable.NewRow();
行[“ID”]=g.First().字段(“ID”);
行[“金额”]=g.Sum(r=>r.Field(“金额”);
行[“百分比”]=g.Sum(r=>r.Field(“百分比”);
返回行;
}).CopyToDataTable();
使用
g.First()
应该是安全的,因为组只有在包含任何项目时才是组

  var x = groupedDataRow.AsEnumerable()
          .Select(g =>
          {
            var row = dataTable.NewRow();
            row["ID"] = g.Select(r => r.Field<decimal>("ID")).FirstOrDefault();
            row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
            row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
            return row;
          }).CopyToDataTable();
  var x = groupedDataRow.AsEnumerable()
          .Select(g =>
          {
            var row = dataTable.NewRow();
            row["ID"] = g.First().Field<decimal>("ID");
            row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
            row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
            return row;
          }).CopyToDataTable();