Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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
C# 如何将一个数据库表转换为;“支点”;数据表?_C#_Mysql_Asp.net_Linq_Datatable - Fatal编程技术网

C# 如何将一个数据库表转换为;“支点”;数据表?

C# 如何将一个数据库表转换为;“支点”;数据表?,c#,mysql,asp.net,linq,datatable,C#,Mysql,Asp.net,Linq,Datatable,我有如下数据,例如: | MemberID | Username | QuestionID | Question | Answer | |----------|----------|------------|------------------|--------| | 58 | John | 1 | Recommend This? | Yes | | 58 | John | 2 | Ho

我有如下数据,例如:

 | MemberID | Username | QuestionID |     Question     | Answer | 
 |----------|----------|------------|------------------|--------|
 |    58    |   John   |     1      | Recommend This?  |  Yes   |
 |    58    |   John   |     2      | How much rating? |  10    |
 |    59    |   Zess   |     1      | Recommend This?  |  No    |
 |    59    |   Zess   |     2      | How much rating? |  8     |
有这样一个类(请忽略一些字段):

并使用mysql阅读器将数据添加到报表列表:

 while (reader.Read())
 {
       reportlist.Add(new reportlist() { MemberID = reader["MemberID"].ToString(), Username = reader["Username"].ToString(),
                        Name = reader["Name"].ToString(), Email = reader["Email"].ToString(), QuestionID = int.Parse(reader["QuestionID"].ToString()), Question = reader["Question"].ToString(),
                        Answer = reader["Answer"].ToString(), Submitted_On = DateTime.Parse(reader["CreationDate"].ToString()), TotalPoint = int.Parse(reader["TotalPoint"].ToString()) });                        
 }
现在我陷入困境,我尝试使用Linq查询:

var groupedList = reportlist
           .GroupBy(u => u.QuestionID, u => u.MemberID)
           .ToList();

DataTable dt = new DataTable();

foreach (var group in groupedList)
{
   //add columns, rows to datatable, stuck here
}
并且不确定如何将这些结果获取到数据表中。基本上,我想将问题分组,让它成为列,并将所有数据添加到datatable以形成这些结果(示例):

请指导如何获得结果或更好的解决方案?我被困了很长一段时间,因为我在林克表现不好。我确实试着四处搜索,结果不多,可能不太明白它是如何工作的


旁白:最终数据表用于EPPlus库(用于生成excel电子表格)

显然,您在问题中发布的代码不能是您的真实代码,因为它具有以下特点,永远不会编译:

 class reportlist { ... }
 reportlist.Add(new reportlist() { ... });
做出一些假设以回答问题:

List<reportlist> list; // the list filled by the data reader.
使用包含“透视”问题列的数据表设置,我们可以为每个成员获取一行作为值数组:

// Get the column values for each member as an array.
var rows = list
    .GroupBy(x => x.MemberID)
    .Select(x => {
        var memberCols = new object[] { x.Key, x.First().Username };
        var answerCols = questions.Select(q => x.Where(a => a.QuestionID == q.Id).Select(a => a.Answer).FirstOrDefault());
        return memberCols.Concat(answerCols).ToArray();
    });
现在填写表格很容易:

// Fill the table.
foreach (var memberRow in rows)
{
    var row = myTable.NewRow().ItemArray = memberRow;
    myTable.Rows.Add(row);
}
其中,使用示例数据,代码如下:

// Show the output
for (var i = 0; i < myTable.Columns.Count - 1; i++)
    Console.Write("{0}, ", myTable.Columns[i]);
Console.WriteLine("{0}", myTable.Columns[myTable.Columns.Count - 1]);
foreach (var row in myTable.AsEnumerable())
    Console.WriteLine(string.Join(", ", row.ItemArray.Select(x => x == null ? "<null>" : x.ToString())));

感谢您的解释和代码。谢谢已经经历了,并且能够解决我的问题。我们一定会学习它,并将其应用到即将到来的工作中~
// Get the column values for each member as an array.
var rows = list
    .GroupBy(x => x.MemberID)
    .Select(x => {
        var memberCols = new object[] { x.Key, x.First().Username };
        var answerCols = questions.Select(q => x.Where(a => a.QuestionID == q.Id).Select(a => a.Answer).FirstOrDefault());
        return memberCols.Concat(answerCols).ToArray();
    });
// Fill the table.
foreach (var memberRow in rows)
{
    var row = myTable.NewRow().ItemArray = memberRow;
    myTable.Rows.Add(row);
}
// Show the output
for (var i = 0; i < myTable.Columns.Count - 1; i++)
    Console.Write("{0}, ", myTable.Columns[i]);
Console.WriteLine("{0}", myTable.Columns[myTable.Columns.Count - 1]);
foreach (var row in myTable.AsEnumerable())
    Console.WriteLine(string.Join(", ", row.ItemArray.Select(x => x == null ? "<null>" : x.ToString())));
Member ID, User Name, Recommend This?, How much rating?
58, John, Yes, 10
59, Zess, No, 8