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

时间:2011-03-16 14:44:41

标签: asp.net vb.net entity-framework linq-to-entities

我有以下查询:

        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

目前没有结果。尝试将此结果集(因为它为空)绑定到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

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

  

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

2 个答案:

答案 0 :(得分:3)

在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

但是,在查询中,您不能使用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

请注意,最终的SingleOrDefault始终正常,但我们必须将查询中的一个更改为FirstOrDefault。这样做的原因是如何实现SingleOrDefault。它告诉DB服务器返回前两个记录,如果返回多个记录则抛出异常。 LINQ to Entities查询 - 一直到最终的SingleOrDefault - 将转换为SQL。在纯SQL查询中表达错误行为并不简单。

参考:here

答案 1 :(得分:2)

您不能以这种方式使用子查询。可以单独执行子查询,仅在主查询中使用已接收的ID,也可以重写查询以使用连接。