Почему толист занимает слишком много времени только для 1 предмета? - PullRequest
0 голосов
/ 17 мая 2019

Я выполняю хранимый вызов SQL Server и пытаюсь получить только 1 элемент.БД возвращается мгновенно, но работает очень медленно, когда я пытаюсь использовать 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

Вызов хранимого процесса:

 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 возвращается мгновенно, так что это не проблема хранимого процесса в БД (проверено напрямуючтобы запустить на БД)

, как вы можете видеть из результатов точки var до следующей команды, это займет до 467 мс только для 1 простого элемента ProductSimple, который содержит только несколько числовых полей, и я попытался переместитьточка отладки взад и вперед для проверки скорости сохраняется на том же промежутке времени.

В другом проекте этот Tolist () очень быстро конвертируется для той же структуры элемента.Какие могут быть неправильные вещи, которые я делаю?

enter image description here

Я использую ядро ​​asp.net 2.2.4 и EF Core 2.2.4

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Запрос не возвращается сразу. Запрос фактически не выполняется до вызова .ToList.

Сколько времени занимает возврат запроса, зависит от времени соединения с вашей базой данных, а также от эффективности запроса.

0 голосов
/ 17 мая 2019

Может возникнуть проблема с холодным запуском Entity Framework .NET Core.

При первом запросе EF компилирует модель.Для такой большой модели это может занять некоторое серьезное время.

есть пара решений для решения проблемы с холодным стартом

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

Наша команда бороласьс этим некоторое время назад.Решением была отправка тестового запроса к таблицам, которые используются во время запуска приложения.

Не могли бы вы попытаться отправить ваш запрос дважды?Если запрос выполняется быстрее, чем первый - это проблема холодного запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...