[英]LINQ how to Filter the data based on the value of the properties
我在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
這里的問題是某些模塊具有相同的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();
現在我用這種算法解決了這個問題,不確定是否最好
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);
任何建議或指導將不勝感激
讓我重新OrderNumber
您的要求:您要顯示每個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
,該IQueryable
生成了您想要選擇的課程計划,但分為兩個級別,因此,通過將查詢展平兩次可以得到最終結果:
var coursePlanList = await plansQuery
.SelectMany(x => x.PlansInSemester
.SelectMany(y => y.PlansInOrderNumber)).ToListAsync()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.