У меня возникли проблемы с управлением большим набором данных с помощью модели linq и telerik, я не могу понять проблему или как linq работает для выполнения запроса.Telerik Linq Extremly Slow при использовании запроса с OrderBy
Я запрашиваю базу данных, используя linq, для записей 300000+, и кажется, что linq выполняет запрос перед применением блоков принятия и пропуска.
Я выполнения этого запроса с помощью LINQ:
var result = repository.Documents.Where(p => p.TenantId = 1 && p.TipoDocumento == SriDocType && p.RucReceptor == ruc).OrderByDescending(p => p.FechaEmision).Take(20).Skip(0).ToList();
Тогда я бегу тот же запрос с помощью SQL:
var result = ((EddocumentRepository)repository).Model.ExecuteQuery<Riverminds.ShardLayer.Eddocument>("SELECT TOP 20 * FROM eddocuments WHERE TenantId = 1 and TipoDocumento = 1 and RucReceptor = '0990017514001' Order By FechaEmision Desc", (new List<System.Data.Common.DbParameter>()).ToArray()).ToList();
На первом запросе я получаю исключение тайм-аут, это занимает больше, чем в минуту запроса, если я изменю максимальное время выполнения, он будет работать, но займет около 2 минут.
Теперь, если я запускаю второй запрос, который в основном является тем же, но с текстом sql, он занимает всего секунду или 2 секунды. Это действительно сумасшествие, но это происходит, и мне нужно использовать linq, потому что я работаю с Kendo Asp Net Mvc и используя ToDataSourceResult, это то же самое, что и linq. Выполнение запроса занимает много времени.
Любая идея ?.
UPDATE
Выполнение некоторых Linq запросов с помощью опубликованных комментариев, я могу понять, что проблема заключается в Paramenters, когда я использую «ККО» Paramenters запрос LINQ бросить исключение тайм-аут, потому что он занимает много времени, чтобы выполнить его, Тот же запрос с SQL занимает 1 секунду.
Удаление условия ruc, с Linq выполняется в то же время, что и SQL, 1 секунда, я проверяю сопоставления, и кажется, что это нормально, столбец имеет значение 255 nvarchar, поэтому я считаю, что что-то не так с параметром ruc. Я отправляю детали отображения столбца и linq и sql, которые занимают 1 секунду.
configuration.HasProperty(x => x.RucReceptor).HasFieldName("_rucReceptor").WithDataAccessKind(DataAccessKind.ReadWrite).ToColumn("RucReceptor").IsNullable().HasColumnType("nvarchar").HasLength(255);
var result = repository.Documents.Where(p => p.TenantId = 1 && p.TipoDocumento == SriDocType).OrderByDescending(p => p.FechaEmision).Take(20).Skip(0).ToList();
var result = ((EddocumentRepository)repository).Model.ExecuteQuery<Riverminds.ShardLayer.Eddocument>("SELECT TOP 20 * FROM eddocuments WHERE TenantId = 1 and TipoDocumento = 1 Order By FechaEmision Desc", (new List<System.Data.Common.DbParameter>()).ToArray()).ToList();
Спасибо за вашу помощь
Сантьяго Муньос
Если вы используете EF6 +, вы можете попробовать выполнить регистрацию SQL-запросов, которые EF создает с помощью делегирования Database.Log, и посмотреть, действительно ли SQL-файлы являются одинаковыми. – Jure
Вы можете легко увидеть сгенерированный SQL с помощью LinqPad. Обязательно используйте тот же поставщик баз данных, что и в вашем приложении. – Phil1970
Я использовал Linq Pad, метод ToString() и события Visual Studio Diagnostic Tools, чтобы увидеть Сгенерированный SQL, и я получил то же самое, сгенерированный sql, если я запускаю как SQL, он занимает 1 секунду, а результат linq - это таймаут. Николов сказал, что, возможно, проблема с параметрами, я попробую изменить типы и увидеть результат. –