Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql Linq to Sql:查询中InvalidCastException的帮助_Linq To Sql - Fatal编程技术网

Linq to sql Linq to Sql:查询中InvalidCastException的帮助

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

我已经编写了一个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]]] 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)