c# - 通过 ID 列表在数据库中搜索记录

标签 c# asp.net asp.net-mvc performance linq

我有一个 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()调用您的代码。这意味着 idListIQueryable<int>哪个 EF 可以理解,而不是首先执行它,它将把它用作子查询或 JOIN在最后一条语句中 - 这将具有明显更好的性能。

还要考虑您是否真的需要 ItemTransactions实例作为一个整体,或者您可以使用 Select 的投影仅查询您实际需要的属性。这将减少必须在您的应用和数据库之间传输的数据量。

关于c# - 通过 ID 列表在数据库中搜索记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54532783/

相关文章:

c# - C#中的简单组合是什么

c# - 如何从 C# 连接到 SQLite 数据库文件?

c# - 在 Asp.net 中显示加载消息

asp.net - WaHostBootstrapper 不断退出并出现错误 WapXmlReadRoleModel=0x1

javascript - 另一个ajax正在运行时进行Ajax轮询

asp.net-mvc - 使剑道日期选择器只读但也可选择

c# - 将字符串的值转换为 C# 中的类型

c# - Windows 窗体 - 在窗体之前显示对话框

c# - try catch block 以显示错误消息

javascript - 使用 Ajax 实现搜索框