Для начала я бы предложил удалить .ToList()
из этой строки:
List sod = db.SODetails.Where(x => x.SiteID == s.ID).ToList();
Когда вы там используете ToList (), вы заставляете выполнение и перечисление происходят с базовым хранилищем данных в этой точке, а не откладывают выполнение до тех пор, пока вам фактически не понадобится перечислить желаемые результаты.
Затем измените следующую строку:
foreach (var details in sod)
Кому:
foreach (var details in db.SODetails
.Where(x => x.SiteID == s.ID && details.SalesOrderID == order.ID))
Компромисс, конечно, заключается в том, что вы попадаете в базу данных с запросом для каждого заказа на продажу, но вы не повторяете одни и те же данные несколько раз.
Вы также можете избавиться от оператора if () в самом внутреннем l oop и просто поместить свое условие в Linq, чтобы ограничить то, что зациклено. Это также может улучшить производительность:
foreach (var details in sod.Where(detail => detail.SalesOrderID == order.ID)