我有一个 ID(项目 ID)列表,我将其传递给查询,如下所示:
using (var ctx = new MyEntities())
{
ctx.Configuration.LazyLoadingEnabled = false;
ctx.Configuration.AutoDetectChangesEnabled = false;
ctx.Configuration.ValidateOnSaveEnabled = false;
ctx.Configuration.ProxyCreationEnabled = false;
var storeItems = ctx.Items.AsNoTracking().Where(y => y.StoreID == 223250).ToList();
var idList = storeItems.Select(y => y.Id).ToList();
var storeTransactions = ctx.ItemTransactions.AsNoTracking().Where(r => idList.Contains(r.Id.Value)).ToList();
return Json("Ok");
}
快速总结一下……StoreItems 列表,例如本例中的 1001 项……
然后通过传递 1001 项目 ID 来获取项目交易,我得到了
265000条记录...
这两个表没有任何关系,但 Id 列被索引以改善结果...
然而,最后的查询性能绝对糟糕,需要一分多钟才能完全完成所有记录的选择,即使我添加了所有调整以加快速度,但它仍然没有帮助.. ..
有谁知道在获取项目交易时我是否还缺少一些东西来加快最后一个查询的速度?
有人可以帮帮我吗?
最佳答案
问题是您将可操作 ID 列表存入内存,然后使用它再次查询。这意味着 EF 会将其翻译为简单的 IN
查询所有硬编码的 ID。其实我什至怀疑因为265000条记录的数量太多了,它实际上会先得到所有ItemTransactions
从数据库然后在内存中进行查询。这会导致性能不佳。但一个简单的更改将使性能显着提高:
using (var ctx = new MyEntities())
{
ctx.Configuration.LazyLoadingEnabled = false;
ctx.Configuration.AutoDetectChangesEnabled = false;
ctx.Configuration.ValidateOnSaveEnabled = false;
ctx.Configuration.ProxyCreationEnabled = false;
var storeItems = ctx.Items.AsNoTracking().Where(y => y.StoreID == 223250);
var idList = storeItems.Select(y => y.Id); //removed ToList on this and previous line
var storeTransactions = ctx.ItemTransactions.AsNoTracking()
.Where(r => idList.Contains(r.Id.Value)).ToList();
return Json("Ok");
}
我所做的唯一更改是删除 ToList()
调用您的代码。这意味着 idList
是 IQueryable<int>
哪个 EF 可以理解,而不是首先执行它,它将把它用作子查询或 JOIN
在最后一条语句中 - 这将具有明显更好的性能。
还要考虑您是否真的需要 ItemTransactions
实例作为一个整体,或者您可以使用 Select
的投影仅查询您实际需要的属性。这将减少必须在您的应用和数据库之间传输的数据量。
关于c# - 通过 ID 列表在数据库中搜索记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54532783/