我编写了一个可以正常工作的SQL查询,但是在转换为LINQ时遇到了一些麻烦。这是SQL:
SELECT
CourseID,
CourseName,
CreditHours,
CPTRequired,
COTRequired,
CPTElective,
COTElective
FROM
Courses
WHERE
(CPTRequired = 'true')
AND
(CourseID NOT IN
(SELECT
Courses_1.CourseID
FROM
Courses AS Courses_1 INNER JOIN
Sections ON Sections.CourseID = Courses_1.CourseID INNER JOIN
Enrollment ON Enrollment.SectionID = Sections.SectionID INNER JOIN
Students ON Students.StudentID = Enrollment.StudentID
WHERE
(Students.StudentID = '11110004')))
这是我到目前为止用LINQ编写的内容:
Dim maj = (From c In connect.Courses _
Where c.CPTRequired = "True" _
Select c.CourseID, c.CourseName, c.CreditHours).Except _
(From en In connect.Enrollments _
Join s In connect.Sections On en.SectionID Equals s.SectionID _
Join cs In connect.Courses On s.CourseID Equals cs.CourseID _
Join st In connect.Students On en.StudentID Equals st.StudentID _
Order By cs.CourseName _
Where st.StudentID = StudentID _
Select cs.CourseID)
执行LINQ语句时会抛出以下错误。
System.InvalidCastException是 未处理的消息=“无法投射 对象类型 'System.Data.Linq.DataQuery'1 [System.String]' 输入 “System.Collections.Generic.IEnumerable'1 [VB $ AnonymousType_6'3 [System.String,System.String,System.Nullable`1 [System.Int32]]]”“。 来源=“最终项目”
我错过了什么?我是LINQ的新手,所以请温柔!!
答案 0 :(得分:1)
我不能肯定地说因为VB语法让我失望了,但我相信这是因为在你之前的语句中你选择了一个新的匿名对象(具有多个属性)并且在查询中被传递除非您只选择一列。因此无法正确比较类型。
有效地,您似乎正在尝试比较:
c.CourseID, c.CourseName, c.CreditHours
与
c.CourseID
并且LINQ不知道如何正确地执行此操作..如果您展开辅助选项,它可能会有效,请选择包括c.CourseName
和c.CreditHours
成功:
Dim maj = (From c In connect.Courses _
Where c.CPTRequired = "True" _
Select c.CourseID, c.CourseName, c.CreditHours).Except _
(From en In connect.Enrollments _
Join s In connect.Sections On en.SectionID Equals s.SectionID _
Join cs In connect.Courses On s.CourseID Equals cs.CourseID _
Join st In connect.Students On en.StudentID Equals st.StudentID _
Order By cs.CourseName _
Where st.StudentID = StudentID _
Select cs.CourseID, cs.CourseName, cs.CreditHours)
但是我再也不熟悉VB语法,所以我能说的最好是试一试。
编辑:将上传日志记录代码从评论移至答案..
Dim sb As New StringBuilder
Dim sw As New StringWriter(sb)
connect.Log = sw
...Do Query & Enumerate Results...
sb.ToString() 'will contain the generated SQL
答案 1 :(得分:0)
我认为除了工作之外,你的选择中的类型不能有所不同:
选择c.CourseID,c.CourseName,c.CreditHours VS
选择cs.CourseID
我认为LINQ会比较整个选定的结果并进行比较。比较这些不同的结果应该在编译时失败。 ???
答案 2 :(得分:0)
我认为您尝试调用Except on的查询尚未运行。尝试添加一个.toList(),或者在其结尾处添加一些IEnumerable的转换:
Dim maj =(来自c in connect.Courses _ 其中c.CPTRequired =“True”_ 选择c.CourseID,c.CourseName,c.CreditHours)
然后在结果上调用Except。
答案 3 :(得分:0)
怎么样
Dim maj = (From c In connect.Courses _
Where c.CPTRequired = "True" &&_
!(From en In connect.Enrollments _
Join s In connect.Sections On en.SectionID Equals s.SectionID _
Join cs In connect.Courses On s.CourseID Equals cs.CourseID _
Join st In connect.Students On en.StudentID Equals st.StudentID _
Order By cs.CourseName _
Where st.StudentID = StudentID _
Select cs.CourseID).Contains(c.CourseID) _
Select c.CourseID, c.CourseName, c.CreditHours)
换句话说......
从y在哪里!(来自b中的a选择 a.foo).Contains(x.foo)select x