Ошибка: метод «Первый» может использоваться только в качестве конечной операции запроса - PullRequest
0 голосов
/ 16 марта 2011

У меня следующий запрос:

        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

Но я все еще получаю ту же ошибку:

Метод «Первый» может использоваться только в качестве конечной операции запроса. Попробуйте вместо этого использовать метод FirstOrDefault в этом случае.

Ответы [ 2 ]

4 голосов
/ 04 марта 2015

В запросе 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.Он сообщает серверу БД вернуть первые две записи, а затем выдает исключение, если возвращается более одной.Запрос LINQ to Entities - все до последнего SingleOrDefault - будет преобразован в SQL.Такое поведение ошибки не просто выразить в чистом запросе SQL.

Ссылка: здесь

2 голосов
/ 16 марта 2011

Вы не можете использовать подзапрос таким образом. Либо выполняйте подзапросы отдельно и используйте только полученные идентификаторы в основном запросе, либо перепишите запрос для использования объединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...