簡體   English   中英

數據庫第一個實體框架查詢的速度非常慢

[英]DB first Entity Framework query incredibly slow

我是數據庫和EF的新手。 我在ASP.NET Core MVC項目中使用EF。 下面的實現代碼來自Controller,旨在將兩個表中的數據組合成一個摘要。

該數據庫具有表:批處理,文檔。

Batch有很多列,包括:int BatchId,字符串BatchEnd。 BatchEnd是格式一致的DateTime,例如23/09/2016 14:33:21

Doc有許多列,包括:字符串BatchId,字符串HardCopyDestination。 許多文檔可以引用相同的BatchId,但是所有引用此文檔的HardCopyDestination都具有相同的值。

我想填充以下ViewModel

public class Batch
{
    public int BatchId { get; set; }
    public string Time { get; set; }  // from BatchEnd
    public string HardCopyDestination { get; set; }
}

但是我下面的當前查詢運行緩慢。 我執行正確了嗎?

var BatchViewModels = new List<Batch>();

// this is fine
var batches = _context.BatchTable.Where(
                  b => b.BatchEnd.Contains( 
                        DateTime.Now.Date.ToString("dd/MM/yyyy")));  


// this bit disappears down a hole
foreach (var batch in batches)
{
    var doc = _context.DocTable.FirstOrDefault(
                  d => d.BatchId == batch.BatchId.ToString());

    if (doc != null)
    {
        var newBatchVM = new Batch
        {
            BatchId = batch.BatchId,
            Time = batch.BatchEnd.Substring(whatever to get time),
            HardCopyDestination = doc.HardCopyDestination 
        };

        BatchViewModels.Add(newBatchVM);
        continue;
    }
}

return View(BatchViewModels);

我認為您每批訪問數據庫一次。 如果您有很多批次,那很昂貴。 您可以一次從數據庫獲得所有文檔。

var batchDict = batches.ToDictionary(b => b.BatchId);
var documents = _context.DocTable.Where(doc => batchDict.Keys.Contains(doc.BatchId));
BatchViewModels.AddRange(documents.Select(d => new Batch
{
    BatchId = d.BatchId,
    Time = batchDict[d.BatchId].BatchEnd.TimeOfDay, // you only want the time?
    HardCopyDestination = d.HardCopyDestination
});

順便說一下,Igor關於日期是正確的,此外,如果BatchId在BatchTable中為int,那么它也應該在DocTable中。 在上面的代碼中,我假設它們是相同的類型,但是如果不是,那么應該不難更改。

Igor對數據庫進行概要分析也是正確的,這是查看問題所在的好方法。 我只是根據您的代碼進行猜測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM