Это ошибка (или в лучшем случае недостаток) в LINQ-to-SQL.Запрос без First
или Take
преобразуется в один порядочный запрос SQL, содержащий OUTER JOIN
.Но, конечно, это даст вам все групп.
Когда LINQ-to-SQL сталкивается с операторами, которые ограничивают число результатов, кажется, что они запрограммированы на применение их к корню.только сущность, а затем запросить присоединяющиеся сущности отдельно.
Самое смешное: это не происходит, когда объединяются Skip
и Take
.Таким образом, в качестве хака вы можете использовать Skip(0).take(x)
, например:
var results = query.Skip(0).Take(3).ToList();
Если вам нужен один результат, вы должны сделать:
var results = query.Skip(0).Take(1).AsEnumerable().First();
Без .AsEnumerable()
снова будетрецидив на 1 + 1 запросов.(Я предполагаю, что перевод SQL First
имеет приоритет в форме запроса).
Это грязный хак, необходимый для борьбы с неплотными абстракциями IQueryable
.Убедитесь, что, если вы решите использовать его, вы хорошо прокомментируете его в коде.
Последний комментарий: возможно, вам следует рассмотреть возможность перехода на более продвинутый ORM, такой как Entity Framework.