错误:方法“First”只能用作最终查询操作

Dav*_*key 2 vb.net asp.net linq-to-entities entity-framework

我有以下查询:

        Dim roommates = From p In dbroom.Residents _
                    Where p.room = queryStudent.First.r.id _
                    Where p.building = queryStudent.First.b.id _
                    Where p.year = year _
                    Where p.semester = term _
                    Select p.person_name
Run Code Online (Sandbox Code Playgroud)

目前它没有返回任何结果。当我尝试将此结果集(因为它是空的)绑定到 ASP.NET 中的转发器时遇到错误,因此我尝试转义它:

   If roommates.Count() = 0 Then
        Dim nomates As String = "No current roommates."
        rptrRoommates.DataSource = nomates
        rptrRoommates.DataBind()
    Else
        rptrRoommates.DataSource = roommates
        rptrRoommates.DataBind()
    End If
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误:

方法“First”只能用作最终查询操作。请考虑在此实例中使用“FirstOrDefault”方法。

Aam*_*mol 6

在 LINQ to Entities 查询中,可以使用 FirstOrDefault() 或 SingleOrDefault 作为最终查询操作。

var right = Context.Foos
                       .Where(f => f.SomeBoolean)
                       .FirstOrDefault();        // works
    var works = Context.Foos
                       .Where(f => f.SomeBoolean)
                       .SingleOrDefault();       // works
Run Code Online (Sandbox Code Playgroud)

但是,在查询内部,您不能使用 SingleOrDefault:

var wrong = Context.Foos
                   .Where(f => f.SomeBoolean)
                   .Select(f => f.Bars.SingleOrDefault())
                   .SingleOrDefault();            // Runtime error
var right = Context.Foos
                   .Where(f => f.SomeBoolean)
                   .Select(f => f.Bars.FirstOrDefault())
                   .SingleOrDefault();            // works
Run Code Online (Sandbox Code Playgroud)

请注意,最终的 SingleOrDefault 总是可以的,但我们必须将查询中的那个更改为 FirstOrDefault。其原因在于 SingleOrDefault 的实现方式。它告诉数据库服务器返回前两条记录,如果返回多条记录,则抛出异常。LINQ to Entities 查询(直到最终 SingleOrDefault 之前的所有查询)都将转换为 SQL。该错误行为无法直接用纯 SQL 查询来表达。

参考:这里