【发布时间】:2023-03-12 22:38:01
【问题描述】:
当我尝试包含代码的注释部分时,选择很慢(获取 21k 需要 5 分钟 行)。
我可以做些什么来提高我的代码的性能
var q = db.Storages.Where(x => x.LocationID == lngID && x.IsStored == true && x.Item.isInUse == false).ToList();
if (q.Count() > 0)
{
List<StorageMdl> lst = q.Select(x => new StorageMdl
{
lngID = x.ID,
strItemID = x.ItemID,
lngLocationID = x.LocationID,
itmMdl = new ItemMdl
{
strID = x.ID
//strBarCode = x.Item.Barcode,
//strColor = x.Item.Color,
//bolIsInUse = x.Item.isInUse,
//bolIsActive = x.Item.isActive,
//dteCreateDate = x.Item.CreateDate.Value,
//strDisposalRefNo = x.Item.DisposalRefNo,
//strCreatedBy = x.Item.CreatedBy,
////dteDisposalDate = x.Item.DisposalDate.GetValueOrDefault(),
//itMdl = new ItemTypeMdl
//{
// lngID = x.Item.ItemType.ID,
// strName = x.Item.ItemType.Name,
// bolHasBarcode = x.Item.ItemType.hasBarcode,
// bolHasManyColors = x.Item.ItemType.hasManyColor,
// strCreatedBy = x.Item.ItemType.CreatedBy,
// dteCreateDate = x.Item.ItemType.CreateDate.HasValue ? (DateTime)x.Item.ItemType.CreateDate : new DateTime(),
// bolIsActive = x.Item.ItemType.isActive
//},
//strITName = x.Item.ItemType.Name,
//strManufacturer = x.Item.Manufacturer,
//strDescription = x.Item.Description
},
bolIsStored = x.IsStored.HasValue ? (bool)x.IsStored : false,
strStoredBy = x.StoredBy,
strApprovedStoreBy = x.ApproveStoreBy,
dteStoredDate = x.StoreDate,
dteItemOut = x.ItemOutDate.HasValue ? (DateTime)x.ItemOutDate : new DateTime(),
strItemOutBy = x.ItemOutApproveBy
}).ToList();
提前谢谢你。 :)
【问题讨论】:
-
您在内存中创建了 21000 个对象。你的机器是什么?恕我直言,如有必要,请尝试重新考虑。如果是网格,你也可以使用分页器。
-
你有什么索引?这些将产生巨大的影响。
-
没有注释掉的代码需要什么时间执行?
-
从原始查询中尽可能多地构建
List<StorageMdl>,不要先将查询存储在q中,然后再循环返回,这简直太疯狂了。 (您知道您正在对数据库进行多少次往返吗?我的话。)只需从一开始就构建它。对于您将默认值代替空值的值,如有必要,请在事后执行此操作。当您合理地加载 21K 对象时,没有理由需要 5 分钟来加载它们(除非考虑到它的负载,您的数据库无法胜任任务)。 -
@AnthonyPegram 嗨,谢谢你的建议,也许我会这样做。无论如何,我只是想知道,因为我有一个使用相同选择方式的函数,但速度更快,唯一的区别是它从 Item 遍历到 ItemType,您认为我的问题与索引有关吗?
标签: c# asp.net-mvc linq