Почему вы пытаетесь проверить счет до выражений foreach? Если результатов нет, foreach просто завершится немедленно.
Ваши запросы фактически все откладываются - они будут выполняться как и когда вы запрашиваете данные. Не забывайте, что ваш самый внешний запрос - это запрос LINQ to Objects: он просто возвращает результат вызова ent.Basket.Where(...).Select(...)
и т.д ..., который фактически не выполняет запрос.
Ваш план выполнения всех трех запросов за один раз фактически не работает. Однако, запрашивая счетчик отдельно, вы, возможно, выполняете каждый запрос к базе данных дважды - один раз просто для получения счетчика и один раз для результатов.
Я настоятельно рекомендую вам избавиться от «оптимизаций» в этом коде, которые делают его намного более сложным и медленнее , чем просто написание самого простого кода, который вы можете.
Я не знаю ни одного способа заставить LINQ to SQL (или LINQ to EF) выполнить несколько запросов за один вызов - но этот подход, конечно, не собирается это делать.
Еще один второстепенный совет, который в данном случае не имеет значения, но может быть полезен в LINQ to Objects - если вы хотите узнать, есть ли какие-либо данные в коллекции, просто используйте Any()
вместо Count() > 0
- таким образом он может остановиться, как только найдет что-нибудь.