我无法使用linq和telerik模型管理大型数据集,我无法弄清楚问题或linq如何执行查询。
我使用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。执行查询需要花费大量时间。
任何想法?。
更新
在发布的注释的帮助下做一些Linq查询,我可以发现问题是参数,当我使用“ruc”参数时,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();
感谢您的帮助
Santiago Munoz
答案 0 :(得分:1)
查询速度的这种差异通常是由于以下原因之一:
生成的SQL语句不是最有效的,在您的情况下,我不相信它是这种情况,因为您的查询非常简单。但是,您可以通过执行
来检查生成的SQL语句string sql = repository.Documents.Where(p => p.TenantId = 1 && p.TipoDocumento == SriDocType && p.RucReceptor == ruc).OrderByDescending(p => p.FechaEmision).Take(20).Skip(0).ToString()
可能存在参数类型不匹配导致服务器端的隐式类型转换,从而阻止SQL Server使用现有索引。通常的嫌疑人是&#34; string&#34;属性类型。从您的示例中我看到:RucReceptor =&#39; 0990017514001&#39;。检查此列的映射(如果它是Unicode)但在db中是varchar,这肯定会对性能产生负面影响。修复映射中的类型以对应于DB中的类型,它应该快速运行。
希望这会有所帮助。