我有以下查询:
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”。
答案 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,也可以重写查询以使用连接。