【问题标题】:Writing a subquery using LINQ in C#在 C# 中使用 LINQ 编写子查询
【发布时间】:2014-05-01 22:15:56
【问题描述】:

我想查询一个生成需要子查询的 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();

【问题讨论】:

  • 这篇文章可能会有所帮助:SO

标签: c# linq


【解决方案1】:

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

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 代码并收到一个编译错误,它无法识别“join”关键字。我正在使用 System.Linq。我目前正在解决此错误。
  • 我想通了。我确定您假设我对 LINQ 有更多的了解。但我没有。我需要将 .AsEnumerable() 添加到 DataTables。这是最终代码:var query = from sectionTbl1 in TableInfo.AsEnumerable() join sectionTbl2 in TableInfo.AsEnumerable() on sectionTbl1.Field&lt;int&gt;("CourseID") equals sectionTbl2.Field&lt;int&gt;("CourseID") where sectionTbl2.Field&lt;int&gt;("SectionID") == iSectionID select sectionTbl1;
  • 很高兴听到你能弄清楚格洛丽亚!
【解决方案2】:

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

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

  1. 课程大师
  2. 部门主管

一个部分必须包含课程参考

这意味着

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

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

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 相同。

【讨论】:

  • 我想查询一个DataTable。 DataTable 绑定到一个gridview。我不知道实体框架。但是我读到的,这意味着我必须从表中生成实体。我只想要一个简单的查询,创建一个包含 CourseID 的所有部分的过滤数据表。
  • 我以为您在谈论您的问题标签所反映的实体框架。
猜你喜欢
  • 2013-06-23
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
相关资源
最近更新 更多