LINQ如何根据属性的值过滤数据

时间:2017-10-06 22:02:47

标签: c# .net linq xamarin

我在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();

现在我通过这个算法解决这个问题而不确定它是否是最好的

    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);

非常感谢任何建议或指导

1 个答案:

答案 0 :(得分:2)

让我重新说明您的要求:您希望显示符合条件的每个OrderNumber的所有计划:他们小组中的任何计划都不应该是&#34;已完成&#34;或者计划本身应该是&#34;已完成&#34;。所有这些都按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()