在C#中使用LINQ编写子查询

本文关键字:查询 LINQ | 更新日期: 2023-09-27 18:01:06

我想查询一个DataTable,它生成一个需要子查询的DataTable。我很难找到合适的例子。这是我想在SQL中创建的子查询:

SELECT *
    FROM SectionDataTable
    WHERE SectionDataTable.CourseID = (SELECT SectionDataTable.CourseID
                                       FROM SectionDataTable
                                       WHERE SectionDataTable.SectionID = iSectionID)

我有SectionID,iSectionID,我想返回Section表中具有iSectionID的CourseID的所有记录。

我可以使用如下所示的两个单独的查询来完成这项工作,但我认为子查询会更好。

string tstrFilter = createEqualFilterExpression("SectionID", strCriteria);
tdtFiltered = TableInfo.Select(tstrFilter).CopyToDataTable();
iSelectedCourseID = tdtFiltered.AsEnumerable().Select(id => id.Field<int>("CourseID")).FirstOrDefault();
tdtFiltered.Clear();
tstrFilter = createEqualFilterExpression("CourseID", iSelectedCourseID.ToString());
tdtFiltered = TableInfo.Select(tstrFilter).CopyToDataTable();

在C#中使用LINQ编写子查询

虽然它不能直接回答您的问题,但您尝试做的事情更适合内部联接:

SELECT *
FROM SectionDataTable S1
   INNER JOIN SectionDataTable S2 ON S1.CourseID = S2.CourseID
WHERE S2.SectionID = iSectionID

然后可以使用linq:对其进行非常相似的建模

 var query = from s1 in SectionDataTable
     join s2 in SectionDataTable
     on s1.CourseID equals s2.CourseID
     where s2.SectionID == iSectionID
     select s1;

在LINQ中工作时,您必须以不同的方式思考问题。尽管你可以按照米奇的建议去。但就我个人而言,我更喜欢使用Navigational属性。

例如,在你给出的例子中,我可以理解你至少有2个表,

  1. 课程硕士
  2. Section Master

一节必须包含课程参考

这意味着

一门课程可以分为多个部分

现在,如果我将这些表视为模型中的实体,我会将导航属性视为

Course.Sections    //<- Sections is actually a collection
Section.Course     //<- Course is an object

因此,相同的查询可以写成,

var lstSections = context.Sections.Where(s => s.Course.Sections.Any(c => c.SectionID == iSectionID)).ToList();

我认为您的主要目标是,您正在尝试提取所有的Sections,其中Courses与给定的SectionCourses相同。