簡體   English   中英

LINQ如何根據屬性值過濾數據

[英]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.

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