Linq to Sql:在我的查询中帮助InvalidCastException

时间:2009-11-05 17:53:09

标签: linq-to-sql

我编写了一个可以正常工作的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的新手,所以请温柔!!

4 个答案:

答案 0 :(得分:1)

我不能肯定地说因为VB语法让我失望了,但我相信这是因为在你之前的语句中你选择了一个新的匿名对象(具有多个属性)并且在查询中被传递除非您只选择一列。因此无法正确比较类型。

有效地,您似乎正在尝试比较:

c.CourseID, c.CourseName, c.CreditHours

c.CourseID

并且LINQ不知道如何正确地执行此操作..如果您展开辅助选项,它可能会有效,请选择包括c.CourseNamec.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