C# 使用LINQ查询数据
我询问了三次,以了解我需要什么,但我相信可能有更好/更聪明的方法C# 使用LINQ查询数据,c#,linq,C#,Linq,我询问了三次,以了解我需要什么,但我相信可能有更好/更聪明的方法 ObservableCollection<ReadingEquipmentViewModel> AllCourses; var allCourses = AllCourses.ToList(); for (int i = 0; i < allCourses.Count; i++) { if (allCourses[i].ClassType == CourseType.IsScience) {
ObservableCollection<ReadingEquipmentViewModel> AllCourses;
var allCourses = AllCourses.ToList();
for (int i = 0; i < allCourses.Count; i++)
{
if (allCourses[i].ClassType == CourseType.IsScience)
{
var EnrollmentList = allCourses[i].Enrollments.ToList()
.Where(x=>x.IsDone || x.IsProgress).ToList();
}
}
observedcollection所有课程;
var allCourses=allCourses.ToList();
for(int i=0;ix.IsDone | | x.IsProgress).ToList();
}
}
首先,您可以使用Where
仅过滤ClassType==CourseType.IsScience
中的项目。然后,您可以使用Select
为每个项目仅检索已完成的登记
或正在进行的:
var result = AllCourses.Where(c => c.ClassType == CourseType.IsScience)
.Select(c => new {
Course = c,
EnrollmentList = c.Enrollments.Where(x=>x.IsDone || x.IsProgress)
});
如果每个项目所需的都是首先用于内部的项目,那么:
var result = AllCourses.Where(c => c.ClassType == CourseType.IsScience)
.Select(c => c. Enrollments.Where(x=>x.IsDone || x.IsProgress));
作为旁注,关于所有的ToList
-除非您想具体化查询中的项目,否则无需调用ToList
正如@NetMage在评论中所建议的,如果您不需要在不同的课程之间进行分隔,只需要一个简单的EnrollmentList
列表,那么使用SelectMany
而不是Select
:
var result = AllCourses.Where(c => c.ClassType == CourseType.IsScience)
.SelectMany(c => c. Enrollments.Where(x=>x.IsDone || x.IsProgress));
首先,您可以使用Where
仅过滤ClassType==CourseType.IsScience
中的项目。然后,您可以使用Select
为每个项目仅检索已完成的登记
或正在进行的:
var result = AllCourses.Where(c => c.ClassType == CourseType.IsScience)
.Select(c => new {
Course = c,
EnrollmentList = c.Enrollments.Where(x=>x.IsDone || x.IsProgress)
});
如果每个项目所需的都是首先用于内部的项目,那么:
var result = AllCourses.Where(c => c.ClassType == CourseType.IsScience)
.Select(c => c. Enrollments.Where(x=>x.IsDone || x.IsProgress));
作为旁注,关于所有的ToList
-除非您想具体化查询中的项目,否则无需调用ToList
正如@NetMage在评论中所建议的,如果您不需要在不同的课程之间进行分隔,只需要一个简单的EnrollmentList
列表,那么使用SelectMany
而不是Select
:
var result = AllCourses.Where(c => c.ClassType == CourseType.IsScience)
.SelectMany(c => c. Enrollments.Where(x=>x.IsDone || x.IsProgress));
试着做些类似的事情
var query = from course in allCourses
from enrollment in course.Enrollments
where course.ClassType == CourseType.IsScience
&& (enrollment.IsDone
|| enrollment.IsProgress)
select enrollment;
var enrollments = query.ToList();
注意:在幕后处理IQueryable时,要小心.ToList
,过早调用.ToList
(如之前的where子句)可能会对代码造成严重的性能损失尝试以下方法
var query = from course in allCourses
from enrollment in course.Enrollments
where course.ClassType == CourseType.IsScience
&& (enrollment.IsDone
|| enrollment.IsProgress)
select enrollment;
var enrollments = query.ToList();
注意:在幕后处理IQueryable时要小心.ToList
,过早调用.ToList
(如之前的where子句)可能会对代码造成严重的性能损失IQueryable
,避免对它们调用ToList
。@DanielA.White我在我的实现中没有看到ToString()
,我的意思是ToList
@DanielA.White,那么我需要知道如何处理而不必接触列表。有什么建议或指导吗?你打算用EnrollmentList
做什么?如果那些是IQueryable
,不要打电话给ToList
。@DanielA.White我在我的实现中没有看到ToString()
。@DanielA.White我的意思是ToList
,那么我需要知道如何处理而不需要接触列表。有什么建议或指导吗?你打算如何处理注册列表
?也许在你的第二次查询中选择多个
会更好?@NetMage-hm。。。可能是。。我会补充一下。我以前没有写的原因是OP可能希望在不同的课程之间保持分离。SelectMange
?Lola也许在第二次查询中选择Many会更好?@NetMage-hm。。。可能是。。我会补充一下。我以前没有写的原因是OP可能希望在不同的课程之间保持分离。SelectMange
?英雄联盟