[英]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.