簡體   English   中英

在linq group by子句中使用變量

[英]using variable in linq group by clause

可以說我有一個包含多個列(學生,老師,學科,分數)的表,我想將這些列中的每一個與具有相同列(具有sum(marks))的另一個表進行比較。

我有以下方法,將列名作為參數,然后在group by子句中使用。

public List<AllMarks> RIMarks(string filter)
{
  var MarkTable = from p in MainDB.classTable
                  let fil = filter
                  group p by new { fil } into g
                  select new AllMarks
                  {
                    Column = g.Key.fil,
                    Marks = g.Sum(f => f.Mark)
                  };

  List<AllMarks> lstRI = MarkTable.ToList();
  return lstRI;
}

public void Test()
{
  var filter = new string[] {"Student", "Teacher", "Subject"}
  foreach (f in filter) 
  {
    // Call RIMarks(f) and do something
  }
}

我的表中有許多不同的學生,但是通過這種方法,我得到的只是第一行過濾條件(即Student)的總和(標記(所有學生))的一行,而實際上並沒有按學生分組。

如何在linq groupby子句中使用局部變量?

更新:示例數據庫:

Student    Teacher    Subject    Marks
stu1       teac1      sub1       23
stu1       teac1      sub1       45
stu2       teac2      sub2       34 

您試圖按您擁有的某些數據對象的特定屬性的名稱進行分組。 您要反映想要的字段的屬性,然后按該字段的值分組。 您不能僅提供名稱,因為過濾器將無法工作,並且只會對整個集合進行分組。

在LinqPad中進行測試。

您所擁有的是分組匯總的分數,不確定是否要取平均值,但是

您在這里擁有的應該會導致您獲得平均水平。

void Main()
{
    var mySchool = new List<School>{
    new School{Student = "Student A", Teacher = "Teacher A", Subject = "Math", Marks = 80},
    new School{Student = "Student B", Teacher = "Teacher A", Subject = "Math", Marks = 65},
    new School{Student = "Student C", Teacher = "Teacher A", Subject = "Math", Marks = 95},
    new School{Student = "Student A", Teacher = "Teacher B", Subject = "History", Marks = 80},
    new School{Student = "Student B", Teacher = "Teacher B", Subject = "History", Marks = 100},
    };

    GroupByFilter("Student", mySchool);
    GroupByFilter("Teacher", mySchool);
    GroupByFilter("Subject", mySchool);
}

public void GroupByFilter(string filter, List<School> school)
{
    PropertyInfo prop = typeof(School).GetProperties()
                                  .Where(x => x.Name == filter)
                                  .First();

    var grouping = from s in school
                   group s by new {filter = prop.GetValue(s)} into gr
                   select new {
                    Filter = gr.Key.filter,
                    Marks = gr.Sum(x => x.Marks)
                   };
    grouping.Dump(); // this is linqpad specific
}

// Define other methods and classes here
public class School{
    public string Student {get;set;}
    public string Teacher {get;set;}
    public string Subject {get;set;}
    public int Marks {get;set;}
}

結果

按學生分組

篩選標記

學生A 160

學生B 165

學生C 95


按教師分組篩選標記

老師A 240

B老師180


按主題分組篩選標記

數學240

歷史180

請嘗試以下代碼。

public List<AllMarks> RIMarks(string filter)
{
if (filter == "Student") {
 var MarkTable = from p in MainDB.classTable
                        group p by new { p.Student} into g
                        select new AllMarks
                             {
                                 Column = g.Key.fil,
                                 Marks = g.Sum(f => f.Mark)
                             };

    }
 else if (filter == "Teacher") {
   var MarkTable = from p in MainDB.classTable
                        group p by new { p.Teacher} into g
                        select new AllMarks
                             {
                                 Column = g.Key.fil,
                                 Marks = g.Sum(f => f.Mark)
                             };
}
 else if (filter == "Subject") {
    var MarkTable = from p in MainDB.classTable
                        group p by new { p.Subject} into g
                        select new AllMarks
                             {
                                 Column = g.Key.fil,
                                 Marks = g.Sum(f => f.Mark)
                             };
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM