我在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);
非常感谢任何建议或指导
答案 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()