【发布时间】:2016-06-22 11:11:43
【问题描述】:
从一开始我就想为愚蠢的问题道歉。我是 MVC 的新手。
当我尝试从数据库加载所有记录时,我的索引页面上的等待操作超时。
我正在使用带有搜索字段和清除选择功能的 PagedList。
我的域模型如下所示
public class BulbBatch
{
public int BulbBatchID { get; set; }
[Required]
public int DeliveryID { get; set; }
public virtual Delivery Delivery { get; set; }
[Required]
public int BulbsAmount { get; set; }
public int? BoxesAmount { get; set; }
[DataType(DataType.Date)]
public DateTime? CoolingDate { get; set; }
public int? BatchLocationID { get; set; }
public virtual Location Location { get; set; }
public string Comments { get; set; }
public string BulbBatchBarCode { get; set; }
public byte[] BulbBatchBarCodeImage { get; set; }
public string BulbBatchImageURL { get; set; }
}
我的索引页面视图模型是下一个
public class BulbBatchViewModel
{
public int BulbBatchID { get; set; }
[DisplayName("Bulb Type Name")]
public string BulbTypeName { get; set; }
[DisplayName("Bulbs Amount")]
public int BulbsAmount { get; set; }
[DisplayName("Location Name")]
public string LocationName { get; set; }
}
因为我需要使用 PagedList,所以我创建了额外的视图模型来实现它。 使用分页列表;
public class BulbBatchListViewModel
{
public int? Page { get; set; }
/// <summary>
/// fields for searching
/// </summary>
public string BulbName { get; set; }
public string BarCode { get; set; }
public string LocationName { get; set; }
/// <summary>
/// using IPageList instead of IEnumerable to create pagination on the view
/// </summary>
public IPagedList<BulbBatchViewModel> SearchResult { get; set; }
public string SearchButton { get; set; }
public string ClearButton { get; set; }
}
最后,我的控制器中有一个 Action Result Index 方法,用于从数据库中检索数据并初始化我的 BulbBatchesListViewModel。 我还尝试使用多个 Include 语句实现 Eager Loading,以减少对数据库的请求量
public ActionResult Index(BulbBatchListViewModel model)
{
db.Configuration.ProxyCreationEnabled = false;
// creating list with My viewModel for one item of BulbBatc because I need to replace indexes and add extra data from related tables
List<BulbBatchViewModel> batchesListVM = new List<BulbBatchViewModel>();
IQueryable<BulbBatch> results;
string barcode = "";
if (!string.IsNullOrEmpty(model.BarCode) || model.Page.HasValue)
barcode = '*' + model.BarCode + '*';
if (!string.IsNullOrEmpty(model.SearchButton) || model.Page.HasValue)
{
//get all records from database based upon filters
results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType).Where(b =>
(b.BulbBatchBarCode.Equals(model.BarCode) || string.IsNullOrEmpty(model.BarCode)) &&
(b.Delivery.BulbType.BulbName.ToLower().Equals(model.BulbName) || string.IsNullOrEmpty((model.BulbName))) &&
(b.Location.LocationName.ToLower().Equals(model.LocationName.ToLower()) || string.IsNullOrEmpty(model.LocationName))
);
//initializing of view for each item in result
foreach (var item in results)
{
var batchVM = new BulbBatchViewModel
{
BulbsAmount = item.BulbsAmount,
BulbTypeName = item.Delivery.BulbType.BulbName,
LocationName = item.Location.LocationName,
};
batchesListVM.Add(batchVM);
}
var pageIndex = model.Page ?? 1;
model.SearchResult = batchesListVM.ToPagedList(pageIndex, RecordsPerPage);
}
else
{
//get all records from database without filtering filters
results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType);
foreach (var item in results)
{
var batchVM = new BulbBatchViewModel
{
BulbsAmount = item.BulbsAmount,
BulbTypeName = item.Delivery.BulbType.BulbName,
LocationName = item.Location.LocationName,
};
batchesListVM.Add(batchVM);
}
var pageIndex = model.Page ?? 1;
model.SearchResult = batchesListVM.ToPagedList(pageIndex, RecordsPerPage);
}
if (!string.IsNullOrEmpty(model.ClearButton))
{
model.BarCode = "";
model.BulbName = "";
model.LocationName = "";
ModelState.Clear();
}
return View(model);
}
当我第一次进入索引页面时(没有任何过滤/搜索)我有一个错误“等待操作超时”
results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType);
foreach (var item in results)
{
var batchVM = new BulbBatchViewModel
...
这是我的 else 语句的一部分
当我尝试从数据库加载 10 行时,它运行良好,但是当我输入 1000 行时,它停止了。
请帮我解决这个问题。
【问题讨论】:
-
你只有轻量级的属性和模型。也许您的数据库连接很慢?
-
@Marius,不。实际上,据我了解,问题是由字段 public byte[] BulbBatchBarCodeImage { get;放; } 在我的模型中。所以我做了什么,我稍微改变了一个选择代码,我不再加载 BarCodeImage 字段了。
标签: c# asp.net-mvc asp.net-mvc-4 model-view-controller