Linq to sql Linq to Sql:查询中InvalidCastException的帮助
我已经编写了一个SQL查询,它工作得很好,但在转换到LINQ时遇到了一些问题。以下是SQL:Linq to sql Linq to Sql:查询中InvalidCastException的帮助,linq-to-sql,Linq To Sql,我已经编写了一个SQL查询,它工作得很好,但在转换到LINQ时遇到了一些问题。以下是SQL: SELECT CourseID, CourseName, CreditHours, CPTRequired, COTRequired, CPTElective, COTElective FROM Courses WHERE (CPTRequired = 'true') AND (Cours
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]]]
Source=“最终项目”
我错过了什么?我是LINQ的新手,所以请温柔点 我不能肯定,因为VB语法把我甩了,但我相信这是因为在之前的语句中,您选择了一个新的匿名对象(具有多个属性),在传递给的查询中,您只选择了一列。因此,它无法正确比较这些类型 实际上,您似乎正在尝试比较:
c.CourseID, c.CourseName, c.CreditHours
与
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
我认为除了工作之外,您不能选择不同的类型: 选择c.CourseID、c.CourseName、c.CreditHours vs 选择cs.CourseID
我认为LINQ会比较整个选择的结果,并进行比较。比较这些不同的结果在编译时应该失败 我认为您尝试调用的查询(除on外)尚未运行。请尝试添加一个.toList(),或在以下字段末尾添加其他转换,以获得IEnumerable: Dim maj=(从连接中的c开始)_ 其中c.CPTRequired=“True”_ 选择c.CourseID、c.CourseName、c.CreditHours) 然后根据结果调用Except。怎么样
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)
换句话说
从x到y在哪里!(从b中的a选择
a、 包含(x.foo)选择x
关于错误,你是对的,但不是解决方案。。。他只关心重复的CourseID,而你的答案将其与CourseName和CreditHours进行比较,这可能与他的数据不符。谢谢Quinton。这就成功了。使select结果具有相同的列可以进行比较。无论出于何种原因,它都会忽略除c.CourseID之外的所有字段中的重复项。它给了我想要的结果,但我不明白原因。@Will-我想说的是,该逻辑可能与实际提供的查询不同,但它应该足以帮助他理解LINQ是如何被解释的。@stratrider您可以通过
connect.Log=writer
将TextWriter附加到DataContext,并查看SQL输出LINQ正在生成,以便更好地了解其工作方式/原因。我建议只制作一个简单的StringWriter/StringBuilder组合,或者使用Console.Out并检查VS IDE中的输出。。如果你需要一些示例代码,请告诉我。
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)