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

时间:2014-04-30 19:45:08

标签: c# linq

我想查询生成需要子查询的DataTable的DataTable。我找不到合适的例子。 这是我想要创建的SQL中的子查询:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

虽然它没有直接回答你的问题,但你想要做的更适合内部联接:

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;

答案 1 :(得分:0)

在LINQ工作时,你必须对事情有所不同。虽然你可以按照Miky的建议去。但我个人更喜欢使用Navigational属性。

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

  1. 课程大师
  2. Section Master
  3. 一个部分必须包含课程参考

    这意味着

    一个课程可以在多个部分

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

    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与给定Section的{​​{1}}相同。