[英]linq refactoring (possibly using nested group by clause)
我已經寫了一些linq,但是我對此不滿意。 我想將兩個linq語句(可能帶有嵌套的group by子句?)重構為一個子句。
var queryDB = from res in Results
where res.SeasonYear == 2013
group res by res.resultDate into g
orderby g.Key
select new
{
ResultDate = g.Key
, ResultList = g.OrderByDescending(r => r.Value)
};
List<result> finalList = new List<result>();
foreach (var list in queryDB.Select(k=>k.ResultList).ToList())
{
var query5 = from item in list
where item.member.classifications.First(c => c.ClassificationYear == 2013).Value != "U"
group item by item.member.classifications.First(c => c.ClassificationYear == ClassificationYear).Value into g
orderby g.Key
select g.ToList().OrderByDescending(r => r.Value).Take(3);
query5.ToList().ForEach(c => c.ToList().ForEach(r => finalList.Add(r)));
}
涉及的實體有:
public class Member
{
public string Surname { get; set; }
public virtual ICollection<Result> Results { get; set; }
public virtual ICollection<Classification> Classifications { get; set; }
}
public class Result
{
public int Value { get; set; }
public int SeasonYear { get; set; }
public Member member { get; set; }
}
public class Classification
{
public string Value { get; set; }
public int ClassificationYear { get; set; }
public Member member { get; set; }
}
成員具有許多結果和許多分類(但每個分類年僅一個分類)。
我需要生成特定年份(例如2013)的結果列表,按日期排序。 需要根據分類類別的Value屬性對結果進行分組,然后按結果類別的Value屬性對結果進行排序。
作為一棵樹,結果集/層次結構可能看起來像這樣:
13/04/2013
classification.Value = A
Result (Result.Value = 44)
Result (Result.Value = 41)
Result (Result.Value = 40)
classification.Value = B
Result (Result.Value = 42)
Result (Result.Value = 39)
Result (Result.Value = 36)
classification.Value = C
Result (Result.Value = 37)
Result (Result.Value = 35)
Result (Result.Value = 34)
11/05/2013
classification.Value = A
Result (Result.Value = 40)
Result (Result.Value = 39)
Result (Result.Value = 38)
classification.Value = B
Result (Result.Value = 39)
Result (Result.Value = 38)
Result (Result.Value = 37)
classification.Value = C
Result (Result.Value = 38)
Result (Result.Value = 36)
Result (Result.Value = 35)
但是最終,我真正想要的只是結果對象的平面列表:
Result (.Value= 44,.Date= 13/04/2013,.Member.Classification.Value for 2013= A)
Result (.Value= 41,.Date= 13/04/2013,.Member.Classification.Value for 2013= A)
Result (.Value= 40,.Date= 13/04/2013,.Member.Classification.Value for 2013= A)
Result (.Value= 42,.Date= 13/04/2013,.Member.Classification.Value for 2013= B)
Result (.Value= 39,.Date= 13/04/2013,.Member.Classification.Value for 2013= B)
Result (.Value= 36,.Date= 13/04/2013,.Member.Classification.Value for 2013= B)
Result (.Value= 37,.Date= 13/04/2013,.Member.Classification.Value for 2013= C)
Result (.Value= 35,.Date= 13/04/2013,.Member.Classification.Value for 2013= C)
Result (.Value= 34,.Date= 13/04/2013,.Member.Classification.Value for 2013= C)
Result (.Value= 40,.Date= 11/05/2013,.Member.Classification.Value for 2013= A)
Result (.Value= 39,.Date= 11/05/2013,.Member.Classification.Value for 2013= A)
Result (.Value= 38,.Date= 11/05/2013,.Member.Classification.Value for 2013= A)
Result (.Value= 39,.Date= 11/05/2013,.Member.Classification.Value for 2013= B)
Result (.Value= 38,.Date= 11/05/2013,.Member.Classification.Value for 2013= B)
Result (.Value= 37,.Date= 11/05/2013,.Member.Classification.Value for 2013= B)
Result (.Value= 38,.Date= 11/05/2013,.Member.Classification.Value for 2013= C)
Result (.Value= 36,.Date= 11/05/2013,.Member.Classification.Value for 2013= C)
Result (.Value= 35,.Date= 11/05/2013,.Member.Classification.Value for 2013= C)
第一個linq語句最初按日期對數據進行分組,然后ResultList包含該日期的所有結果。
然后,循環中的第二個linq語句處理每個ResultList,按分類對數據進行分組(忽略某些分類)並對這些結果進行排序,最后獲得前3個結果。
循環還具有(我認為是)可怕的.ToList(ForEach(.ToList(.ForEach())))lambda表達式,可以將層次結構展平為結果對象列表。
因此,盡管這確實有效,但它非常可怕。 如何合並兩個linq語句並替換lambda表達式以使結果變平?
好的,所以我想出的最后一個linq是這個,包括最后的SelectMany可以拼湊成一個列表:
var filteredResults =
from res in Results
where res.SeasonYear == 2013
orderby res.resultDate
group res by res.resultDate into dateGroup
select new
{
ResultDate = dateGroup.Key,
ResultList =
from r in dateGroup
where r.member.classifications.Single(c => c.year == 2013).Value != "U"
group r by r.member.classifications.Single(c => c.year == 2013).Value into classifications
orderby classifications
select new
{
ClassificationGroup = classifications.Key,
ClassificationList =
from r2 in classifications.OrderByDescending(r => r.Value).Take(3)
select r2
}
};
finalList = filteredResults.SelectMany(item => item.ResultList)
.SelectMany(inner=>inner.ClassificationList)
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.