У меня есть немного другой взгляд на это; при профилировании (с нашим блестящим профилировщиком ) мы заметили, что LINQ (в данном случае с SQL) выполняет разумную работу, генерируя TSQL для базовых запросов, и операция выполняется очень быстро на сервере БД (0,5 мс и т. д.) - однако фактическая операция запроса занимала НАМНОГО дольше (например, 20 мс + для одного и того же запроса 0,5 мс, в некоторых случаях). Так где же было время? Вы можете подумать «запросить перевод», но нет; у нас также есть много ExecuteQuery<T>
кода (то есть, где вы пишете TSQL вручную), и это делало точно так же . Оказалось, что где-то между материализатором и картой идентификации теряется огромное количество времени.
Итак, мы написали наш собственный материализатор, который был в значительной степени заменой ExecuteQuery
и, таким образом, родился буйство .
На большей части LINQ он обычно работает нормально при генерации TSQL для простых запросов, но для всего сложного я обычно доверяю TSQL, написанному вручную, гораздо больше. Чтобы взять случай в качестве примера, у меня был сложный запрос, включающий группы, пропуски и взятия. Это не очень хорошо. Когда я написал это вручную с помощью ROW_NUMBER () и т. Д., Те же результаты заняли 4% от «статистики IO» и общего времени.
Мое текущее мнение о LINQ состоит в том, что инструменты ORM делают данные мутации бризом, но для запроса я склонен использовать dapper . Что иронично, поскольку Q в LINQ - это «запрос».