我对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);
调用存储的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()可以非常快速地转换相同的项目结构。我可能做错什么事?
我正在使用asp.net core 2.2.4和EF Core 2.2.4
答案 0 :(得分:0)
查询不会立即返回。直到.ToList调用,查询才真正执行。
查询返回所需的时间取决于连接到数据库的时间以及查询的效率。
答案 1 :(得分:-1)
Entity Framework .NET Core冷启动可能有问题。
在第一个查询中,EF编译模型。这可能会很严重 这么大的模型的时间。
有几种解决冷启动问题的方法
https://entityframework.net/why-first-query-slow
前一段时间,我们的团队正在为此苦苦挣扎。 解决方案是将测试请求发送到应用程序启动期间使用的表。
您可以尝试两次发送请求吗?如果请求执行得更快,那么第一个请求-冷启动问题。