В запросе 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.
Ссылка: здесь