Использовать Stored procedures для сложного чтения Для сложного чтения из базы вместо LINQ используйте stored procedures (фильтры, поиск, большое количество данных, большое число параметров).
Применять LINQ Include для включения связанных данных Используйте LINQ Include, чтобы сразу включить в запрос дополнительные связанные небольшие таблицы (иначе внешние ключи будут делать много лишних запросов из за lazy loading).
Использовать SQL в связке с Dapper для сложных и долгих запросов Для сложных и долгих запросов имеет смысл использовать не LINQ, а SQL в связке с Dapper (https://gist.github.com/panesofglass/5212462). Это средство исполнения SQL и мапинга результата в объекты. Вы можете мапить в Entity объекты, либо в dymanic объекты. В некоторых случаях Dapper дает выигрыш более чем в 5 раз по сравнению в LINQ.
Применять по возможности Data Reader Data Reader – это самый быстрый способ извлечения большого списка данных (если не Data Reader – то тогда используйте Dapper, как более удобную оболочку).