为什么只花1个项目就花太长时间?

时间:2019-05-17 11:26:58

标签: c# asp.net-core

我对SQL Server进行了一次storageproc调用,但我尝试仅获取1个项目。 db立即返回,但是当我尝试使用ToList()时它运行非常慢

 public partial class Product: BaseEntity, ISlugSupported
{
    public string Name { get; set; }
    public int ManufacturerId { get; set; }       
    public string Sku { get; set; }
    public decimal Price { get; set; }
    public bool InStock { get; set; }
    public int StockQuantity { get; set; }
    public decimal ProductCostInUSD { get; set; }
    public decimal ProductCostInUSDOldPrice { get; set; }
    public decimal ProductCostInPound { get; set; }       
    public decimal ProductCostInEuro { get; set; }     
    public decimal ProductCostInVND { get; set; }
    public bool Published { get; set; }
    public decimal ExchangeRateUSD { get; set; }     
    public decimal ExchangeRateEuro { get; set; }    
    public decimal ExchangeRatePound { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }
    public string Createdby { get; set; }

    public int Status { get; set; }
    public int? CategoryId { get; set; }        

}

Storedproc方法:

     public class EFRepository<T> : IRepository<T> where T : BaseEntity
    {

        private readonly ApplicationDbContext _context;
        private DbSet<T> _entities;
        public EFRepository(ApplicationDbContext context)
        {
            this._context = context;            
        }
      public IQueryable<T> ExecuteStoredProcedureList(string commandText, params object[] parameters) 
        {
            return _context.Set<T>().FromSql(commandText, parameters);           

        }
}

DbContext:

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        base.OnModelCreating(builder);
        builder.Entity<Product>()
           .ToTable("Product")
           .Ignore(p => p.ProductFinalCost);

enter image description here

调用存储的Proc:

 var query = _productRepository.ExecuteStoredProcedureList("dbo.[SearchProducts] " +
                  "@Keywords, @PageIndex,@PageSize,@SortBy,@FromDate, @ToDate,@Sku,@CreateBy,@CategoryIds,@OrderIds,@ShowPublished,@Discontinued,@Discount,@LoadFilterableSpecificationAttributeOptionIds, @FilterableSpecificationAttributeOptionIds OUTPUT,@PriceMin,@PriceMax,@ShowExpiredProduct,@FilterableBrands OUTPUT,@TotalRecords OUTPUT,@FilteredSpecs, @FilteredBrands,@LoadSimple,@TrungvangPick",
                  pKeywords,
                  pPageIndex,
                  pPageSize,
                  pSortBy,
                  pFromDate,
                  pToDate,
                  pSku,
                  pCreatedBy,
                  pCategoryIds,
                   pOrderIds,
                  pShowPublished,
                   pDiscontinued,
                   pDiscount,                      
                  pLoadFilterableSpecificationAttributeOptionIds,
                  pFilterableSpecificationAttributeOptionIds,
                  pPriceMin,
                  pPriceMax,
                  pShowExpiredProduct,
                  pFilterableBrands,
                  pTotalRecords,
                  pFilteredSpecs,
                  pFilteredBrands,
                  pLoadSimple,
                  pTrungvangPick
                 );
            var result = query.ToList();
            int totalRecords = pTotalRecords.Value != DBNull.Value ? Convert.ToInt32(pTotalRecords.Value) : 0;

sqlserver上存储的proc立即返回,因此这不是db存储proc问题(直接测试可在db上运行)

从var结果到下一条命令,您可以看到,仅1个简单项目ProductSimple最多花费467ms,该项目仅包含几个数字字段,我尝试来回移动调试点以检查速度,它仍保持相同的时间。

在另一个项目中,此Tolist()可以非常快速地转换相同的项目结构。我可能做错什么事?

enter image description here

我正在使用asp.net core 2.2.4和EF Core 2.2.4

2 个答案:

答案 0 :(得分:0)

查询不会立即返回。直到.ToList调用,查询才真正执行。

查询返回所需的时间取决于连接到数据库的时间以及查询的效率。

答案 1 :(得分:-1)

Entity Framework .NET Core冷启动可能有问题。

  

在第一个查询中,EF编译模型。这可能会很严重   这么大的模型的时间。

有几种解决冷启动问题的方法

https://entityframework.net/why-first-query-slow

前一段时间,我们的团队正在为此苦苦挣扎。 解决方案是将测试请求发送到应用程序启动期间使用的表。

您可以尝试两次发送请求吗?如果请求执行得更快,那么第一个请求-冷启动问题。