Вопрос

Собственно, это тот же вопрос, что и в этом посте:

Как я могу убедиться, что запросы LINQ выполняются при вызове в моем DAL, а не с задержкой?

Но поскольку он не объяснил почему он этого хотел, вопрос, кажется, немного обошел стороной.Вот моя похожая, но лучше объясненная проблема:

У меня есть несколько потоков двух типов (на мгновение игнорируя потоки пользовательского интерфейса).Существует тип потока «сбор данных» и тип потока «вычисление».Потоки сбора данных работают медленно.Нужно проанализировать довольно много данных из разных мест.Потоки вычислений выполняются сравнительно быстро.Модель проектирования до этого момента заключалась в том, чтобы отправлять потоки сбора данных для поиска данных, а когда они будут завершены, передавать данные для вычислений.

Когда я кодировал сбор данных в Linq, мне пришлось увеличить некоторую медлительность. обратно в мои вычислительные потоки.Теперь есть элементы данных, которые не могут быть решены полностью, пока они не будут использованы во время вычислений, и это проблема.

Я хотел бы заставить Linq завершить свою работу в определенное время (конец оператора?конец метода?вызов метода «пожалуйста, закончи, черт возьми»), чтобы я знал, что не буду платить за это позже.Добавление «.ToList()» в конец Linq равно 1.неудобно и 2.такое чувство, будто упаковываешь что-то, что вот-вот будет распаковано в другом треде.

Это было полезно?

Решение

Вы не будете ничего боксировать — вы будете буферизовать результаты.

С использованием ToList() по сути, это то, что вам нужно, если вам действительно нужны данные.Если вы не готовы использовать данные немедленно, их необходимо буферизовать. где-то, не так ли?Список — это просто удобный способ сделать это.

Альтернатива состоит в том, чтобы сразу же выполнить обработку — с радостью использовать данные по мере их получения.Я не совсем уследил за разными темами, поэтому мне неясно, поможет ли это вам, но, насколько я понимаю, это в основном варианты, доступные вам.

Это на самом деле в некотором роде явно в вашем описании:

Модель проектирования до этого момента состоит в том, чтобы отправлять потоки сбора данных, чтобы найти данные, и когда они завершены, передают данные для вычисления.

Вызов ToList() по сути меняет то, что вы возвращаете, с «запроса, который может получить данные по запросу» на «сами данные, буферизованные в списке».

Другие советы

Можете ли вы объяснить больше, почему .ToList неприемлем?Вы упомянули бокс и распаковку, но это совершенно не связанные темы.

Часть принудительного выполнения запроса LINQ по требованию требует сохранения результатов.В противном случае, чтобы снова увидеть результаты, вам придется повторно обработать запрос..ToList эффективно достигает этого, сохраняя элементы в List<T>.

Можно хранить элементы практически в любой другой структуре данных в стиле коллекции с различными компромиссами, которые могут лучше соответствовать вашим потребностям.

Eсть LoadOptions недвижимость в DataContext класс, который поможет вам быстрее получать данные.

В противном случае вы могли бы использовать несколько умных размещений. ToList() х.

Я знаю, что эта тема старая...в любом случае, забавно, что никто еще не упомянул .ToLast().Я делаю что-то, где linq - это не что иное, как прославленный foreach, приводящий к некоторым побочным эффектам, когда меня не особо волнует результат запроса...поэтому я не хотел выделять больше фиктивной памяти, чем необходимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top