Вы обязательно должны искать либо замену LINQ to Entities, либо хотя бы замену Entity SQL для этого кода.
Каждый раз, когда вы задаете запрос с помощью EF ObjectContext, а затем перечисляете запрос (например, выполняя foreach над ним или преобразовывая его в список с помощью ToList () и т. Д.), Вы будете отправлять другой запрос в базу данных. В вашем примере у вас есть 3 вложенных цикла foreach, поэтому вы отправляете в базу данных как минимум 3 разных запроса (и, возможно, больше, в зависимости от того, какие дочерние данные вы извлекаете вместе с основными запросами), когда вы можете отправьте только один запрос, содержащий соответствующие объединения между вашими таблицами, чтобы получить все данные за один раз. Ваш метод, по-видимому, также извлекает намного больше данных, чем вам, вероятно, нужно, потому что вы извлекаете все записи через цикл foreach, а затем эффективно объединяете / фильтруете все данные в памяти в вашем коде. Кроме того, если вы используете отложенную загрузку, возможно, вы отправляете дополнительные запросы для получения связанных данных. Вы можете получить эти данные в запросе, используя вызов Include(...)
, который может быть быстрее в зависимости от того, как используются результаты.
Если вы реализуете правильный запрос LINQ to Entities и не перечисляете его до тех пор, пока запрос не будет полностью указан, вы можете получить гораздо более производительный и эффективный запрос, поскольку EF будет смотреть на все, что делает ваш запрос, и сгенерирует полный оператор SQL для вас. Запрос будет выполнен только тогда, когда вы перечислите его в конце. Это бонус за отложенное выполнение, который вы автоматически получаете от LINQ.
Обратите внимание, что это в основном обобщения, но суть в том, что вам следует избегать извлечения больших наборов записей из базы данных и фильтрации в памяти, а также избегать перечисления EF-запроса, пока вы не узнаете, что он довольно завершен и готов к идти.