c# - Where 和 Contains 的 LINQ to Entities 性能问题

标签 c# sql linq

表 A 包含 - ID(PK)、零件编号、代码 1、代码 2

表 B 包含 - InventoryID(PK) PartNumber、Part 和一堆其他列。

我需要从表 B 中获取所有内容,其中表 B 的 PartNumber 不在表 A 中。

示例:表 B 的零件编号为 123。表 A 中没有零件编号为 123。获取该行。

我目前拥有的:

using (SomeEntity context = new SomeEntity())
{
var partmasterids = context.PartsMasters.Select(x => x.PartNumber).Distinct().ToList();
var test = context.Parts.Where(x => !partmasterids.Contains(x.PartNumber)).ToList();
}

我目前首先从表 A 中获取并选择所有不同的部件号。

然后我检查表 A 和表 B 的零件编号,并从表 B 中获取每个零件,其中该零件编号不在表 A 中。

表 B 中约有 11,000 条记录,表 A 中约有 200,000 条记录。 我应该得到大约 9000 个表 A 中没有的零件。

我在第二个 LINQ 语句中遇到了巨大的性能问题。如果我执行 .Take(100),甚至需要大约 20-30 秒。超过 1000 的任何内容都会花费太长时间。

是否有更好的方法来编写此 LINQ 语句?

最佳答案

根据我对你问题的理解,SQL 中的等价物是这样的

SELECT DISTINCT B.PartNumber AS MissingParts
FROM TableB as B 
LEFT OUTER JOIN TableA as A ON B.PartNumber = A.PartNumber
WHERE A.PartNumber IS NULL

运行该 SQL 并测量它所花费的时间。如果没有索引,这就是最快的速度。

现在,如果您确实必须在 EF 中执行此操作,则需要执行等效语句,并使用左连接完成。基于this question ,它看起来像这样

var query = from b in TableB
        join a in TableA on b.PartNumber equals a.PartNumber into joind
        from existsInA in joind.DefaultIfEmpty()
        where existsInA == null
        select b.PartNumber;

var missingParts = query.Distinct().ToList();

关于c# - Where 和 Contains 的 LINQ to Entities 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900060/

相关文章:

c# - 用于将两个 id 与单个列表连接的 linq SQL 语句

c# - Office.Interop.Powerpoint 导入

c# - 动态 CSS - 缓存问题?

java - 将表从 postgresql 数据库绑定(bind)到 Netbeans GUI 表时出错

php - 使用 php 更新数据库

c# - 如何向表达式添加另一个条件?

c# - 如何在 azure 网站上发送电子邮件?

c# - 我的内存在哪里?重新初始化数据表

具有动态值的 MySql 条件插入

c# - LINQ 与 @Html.DropDownList 不同