我在使用linq和telerik模型管理大型數據集時遇到了麻煩,我無法弄清楚問題或者linq如何執行查詢。Telerik Linq在使用OrderBy查詢時極其緩慢
我使用linq查詢數據庫到300000 +記錄,似乎linq在應用take和skip參數之前執行查詢。
我使用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();
在第一查詢我得到一個超時例外,它需要超過一分鐘的查詢,如果我改變maxexecutiontime,它會工作,但會花費2分鐘。
現在,如果我運行第二個查詢基本上是相同的事情,但與SQL文本,它只需要一秒或2秒。這真的很瘋狂,但它正在發生,我需要使用linq,因爲我正在使用Kendo Asp Net Mvc並使用與Linq相同的ToDataSourceResult。執行查詢需要很長時間。
任何想法?
UPDATE
做與的投稿留言幫助一些LINQ查詢,我可以計算出,這個問題是paramenters,當我使用「中國人民大學」 paramenters LINQ查詢扔,因爲它超時異常需要花費大量時間來執行它,使用SQL的相同查詢需要1秒。
刪除ruc條件,與Linq需要與SQL相同的時間,1秒鐘,我檢查映射,它似乎沒問題,列是一個255 nvarchar爲空,所以我認爲參數ruc有些問題。我發佈了列的映射細節以及需要1秒的linq和sql。
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 +,可以嘗試使用Database.Log委託記錄EF生成的SQL,並查看SQL是否實際相同。 – Jure
您可以使用LinqPad輕鬆查看生成的SQL。確保使用與您的應用程序中相同的數據庫提供程序。 – Phil1970
我使用Linq Pad,ToString()方法和事件的Visual Studio診斷工具來查看生成的SQL,我得到了同樣的東西,生成的SQL如果我運行SQL爲1秒,並且linq結果超時。 Nikolov說,也許參數有問題,我會嘗試更改類型並查看結果。 –