2017-10-06 59 views
1

我有在LINQ過濾數據有問題的值的數據,這裏是我的模型:LINQ如何篩選基於性能

public class CoursePlan 
    { 
     [PrimaryKey, AutoIncrement] 
     public int Id { get; set; } 
     public string Semester { get; set; } 
     public string ModuleCode { get; set; } 
     public string ModuleName { get; set; } 
     public string Credits { get; set; } 
     public string OrderNumber { get; set; } 
     public string ModuleStatus { get; set; } 

    } 

,這裏是我的數據Json

enter image description here

這裏的問題有些模塊具有相同的OrderNumber這意味着它們是可選的,學生必須研究其中的一個,如果學生已經學習其中之一,我應該忽略同一訂單號中的其他模塊。

以其他方式來描述這個問題

我想回到CoursePlan和這個名單上的列表中是否存在具有相同OrderNumber檢查ModuleStatus對於他們中的每一個,如果兩個項目

任何一個Completed刪除該訂單上的其他模塊將全部退回。

這裏是我的代碼

var coursePlanList = await _sqLiteAsyncConnection.Table<CoursePlan>().ToListAsync(); 
var groupedData = coursePlanList.OrderBy(e => e.Semester) 
    .GroupBy(e => e.OrderNumber) 
    .Select(e => new ObservableGroupCollection<string, CoursePlan>(e)) 
    .ToList(); 

通過這種算法,現在的IM解決這一點,不知道這是否是最好的

var coursePlanList = await _sqLiteAsyncConnection.Table<CoursePlan>().ToListAsync(); 

    List<CoursePlan> finalList = new List<CoursePlan>(); 

    var counter = 0; 
    foreach (var itemPlan in coursePlanList) 
    { 
     if (counter > 0 && counter < coursePlanList.Count) 
      if (itemPlan.OrderNumber == coursePlanList[counter - 1].OrderNumber) 
      { 
       if (itemPlan.ModuleStatus == "Completed") 
       { 
        finalList.RemoveAll(a => a.OrderNumber == itemPlan.OrderNumber); 
        finalList.Add(itemPlan); 
       } 
       Debug.WriteLine(itemPlan.ModuleName + "With -->" + coursePlanList[counter - 1].ModuleName); 
      } 

      else 
       finalList.Add(itemPlan); 

     counter++; 
    } 

    var groupedData = finalList.OrderBy(e => e.ModuleStatus) 
     .ThenBy(e => e.Semester) 
     .GroupBy(e => e.Semester) 
     .Select(e => e) 
     .ToList(); 

    CoursePlanViewList.BindingContext = new ObservableCollection<IGrouping<string, CoursePlan>>(groupedData); 

任何建議或指導,將不勝感激

+0

我懷疑這個複雜的東西不能單獨使用LINQ來完成,或者至少不能在單個查詢中完成。但是一些LINQ專家可能會證明我錯了。 – Jason

+0

我在考慮將列表分成兩個列表,但這會影響處理速度,也不能按我期望的那樣工作,順便說一句,其他專家 –

回答

2

讓我改述你的要求:你想顯示所有的計劃p呃OrderNumber滿足條件:他們的小組計劃都不應該是「完成」或計劃本身應該是「完成」。這一切分組由Semester

var plansQuery = 
from p in _sqLiteAsyncConnection.Table<CoursePlan>() 
group p by p.Semester into sem 
select new 
{ 
    PlansInSemester = 
     from p in sem 
     group p by p.OrderNumber into gp 
     select new 
     { 
      PlansInOrderNumber = 
       gp.Where(p => !gp.Any(p1 => p1.ModuleStatus == "Completed") 
          || p.ModuleStatus == "Completed") 
     } 
}; 

這使你產生你要選擇的課程計劃的IQueryable,但在兩個級別進行分組,因此被壓扁查詢兩次,得到的最終結果是:

var coursePlanList = await plansQuery 
    .SelectMany(x => x.PlansInSemester 
     .SelectMany(y => y.PlansInOrderNumber)).ToListAsync() 
+0

每個學期的每個模塊都有唯一的orderNumber,如果2個模塊具有相同的OrderNumber,則意味着一個如果是,則有兩個或三個模塊具有相同的訂單,其中一個訂單狀態已完成,則忽略該訂單上的其他模塊並返回已完成訂單,否則,如果所有三個訂單完全相同且沒有任何訂單完成,然後返回它們,希望你明白我的意思 –

+0

這個查詢是否提供了預期的輸出?我想我跟着你,但根據我的理解,查詢完全符合你的要求。 –

+0

我用我的基本解決方案修改了我的問題,也許你會從我的解決方案中理解我的要求我已經嘗試過您的查詢,1:僅返回學期和計劃對象,我修改它但未獲取預期值,如果可以使查詢返回整個屬性, –