2016-09-16 14 views
0

このような結果を得たLINQクエリがあります。被験者の数が固定されていない:LINQを使用して同じ値の列を列にグループ化します

Student Subject Mark 
Adam  English 80 
Adam  Math  70 
Adam  Science 60 
Moses English 95 
Moses Science 75 

は、今私が望むすべては

Student English Math Science 
Adam 80  70  60 
Moses 95    75 

を以下のようにそれを変換することです。被験者は知られており、固定されている場合は

+0

サブジェクトが修正されていない場合、結果はプロパティを持つクラスにはなりません。それであなたは何を期待していますか? –

+0

より多くのコードを提供するか、結果に何をしたいか、またはあなたがatmに直面している問題を説明してください。 – Niklas

答えて

1

てみコードをこの

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication12 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable sourceTable = new DataTable(); 
      sourceTable.Columns.Add("Student", typeof(string)); 
      sourceTable.Columns.Add("Subject", typeof(string)); 
      sourceTable.Columns.Add("Mark", typeof(int)); 

      sourceTable.Rows.Add(new object[] { "Adam","English", 80}); 
      sourceTable.Rows.Add(new object[] { "Adam","Math", 70}); 
      sourceTable.Rows.Add(new object[] { "Adam","Science", 60}); 
      sourceTable.Rows.Add(new object[] { "Moses","English", 95}); 
      sourceTable.Rows.Add(new object[] { "Moses","Science", 75}); 

      List<string> subjects = sourceTable.AsEnumerable().Select(x => x.Field<string>("Subject")).Distinct().ToList(); 
      DataTable pivotTable = new DataTable(); 
      pivotTable.Columns.Add("Student", typeof(string)); 
      foreach(string subject in subjects) 
      { 
       pivotTable.Columns.Add(subject, typeof(int)); 
      } 
      var students = sourceTable.AsEnumerable() 
       .GroupBy(x => x.Field<string>("Student")).ToList(); 

      foreach (var student in students) 
      { 
       DataRow newRow = pivotTable.Rows.Add(); 
       newRow["Student"] = student.Key; 
       foreach (DataRow row in student) 
       { 
        newRow[row.Field<string>("Subject")] = row.Field<int>("Mark"); 
       } 

      } 
     } 
    } 
} 

enter image description here

2

あなたが使用できます。

var query = db.StudentMarks 
    .GroupBy(x => x.Student) 
    .Select(g => new { 
     Student = g.Key, 
     English = g.Where(x => x.Subject == "English").Sum(x=> x.Mark), 
     Math = g.Where(x => x.Subject == "Math").Sum(x=> x.Mark), 
     Science = g.Where(x => x.Subject == "Science").Sum(x=> x.Mark), 
    }); 
+0

あなたは私にそれを打つ! +1 –

+1

件名は固定されていません。 –

+0

@ParvezMRobin:sql-serverのような実際の['PIVOT'](https://technet.microsoft.com/en-us/library/ms177410(v = sql.105).aspx)演算子はありません。あなたはこのようなアプローチを試みることができます:http://stackoverflow.com/a/6282079/284240私はストアドプロシージャ、テーブル値関数またはビューでそのようなことをやりたいと思います。次に、これらの関数/ビューをLINQで照会できます。 –

0

ようがあるでしょうあなたはどのように多くの科目がわからない場合情報をネストされた辞書に照合することができます。

var subjectMarksByStudent = new Dictionary<string, Dictionary<string, int>>(); 
foreach (var studentMark in studentMarks) 
{ 
    Dictionary<string, int> subjectsAndMarksForStudent; 
    if (subjectMarksByStudent.TryGetValue(studentMark.Name, out subjectsAndMarksForStudent)) 
    { 
     subjectsAndMarksForStudent.Add(studentMark.Subject, studentMark.Mark); 
    } 
    else 
    { 
     subjectMarksByStudent.Add(studentMark.Name, new Dictionary<string, int> {{ studentMark.Subject, studentMark.Mark }}); 
    } 
} 
関連する問題