Telerik Linq在使用order查询时非常慢

本文关键字:查询 非常 order Linq Telerik | 更新日期: 2023-09-27 18:05:51

我在管理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,因为我正在使用剑道asp.net Mvc和使用ToDataSourceResult,这是相同的事情比linq。执行查询需要花费很多时间。

任何主意吗?

在发布评论的帮助下做一些Linq查询,我可以找出问题是参数,当我使用"ruc"参数时,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();

谢谢你的帮助

圣地亚哥穆尼奥斯

Telerik Linq在使用order查询时非常慢

查询速度的差异通常是由于以下原因之一:

  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()
    
  2. 可能存在参数类型不匹配导致服务器端隐式类型转换,从而阻止SQL服务器利用现有索引。通常怀疑的是"字符串"类型的属性。从你的例子中我看到:RucReceptor = '0990017514001'。检查该列的映射,如果它是Unicode,但在数据库中是varchar,这肯定会对性能产生负面影响。修复映射中的类型以对应于DB中的类型,它应该运行得很快。

希望这对你有帮助。