C# 通过传递主键列表在实体框架中使用Find方法的多个记录

C# 通过传递主键列表在实体框架中使用Find方法的多个记录,c#,entity-framework,linq,C#,Entity Framework,Linq,我在SQL Server中有一个联系人表,我在C控制台应用程序中使用实体框架映射了该表: EmployeeId FirstName LastName -------------------------------- 1 Ram Kumar 2 Mohan Raj 3 Aravind Swaamy 4 Ajay Kumar 5 Ram

我在SQL Server中有一个联系人表,我在C控制台应用程序中使用实体框架映射了该表:

EmployeeId  FirstName   LastName
--------------------------------
1           Ram         Kumar
2           Mohan       Raj
3           Aravind     Swaamy
4           Ajay        Kumar
5           Ram         Raj
我需要取1,3,5个雇员ID的记录

目前我正在做以下的事情

List<Employees> emp = new List<Employees>();

var emp1 = dbContext.Employee.Find(1);
var emp3 = dbContext.Employee.Find(3);
var emp5 = dbContext.Employee.Find(5);

emp.Add(emp1);
emp.Add(emp3);
emp.Add(emp5);
请帮助我如何通过传递主键值列表来使用Find方法获取记录列表

有些人认为这个问题是重复的。不,这是绝对错误的。我的问题是如何使用Find扩展方法获取多个记录。因为在操作中执行比查找操作慢

我的问题是如何使用FIND扩展方法获取多个记录

你不能;“查找”会找到一条记录,这不是您想要的

因为在操作中执行比查找操作慢

不,不是。您当前的代码执行以下操作:

SELECT * FROM Employee WHERE EmployeeId = 1
SELECT * FROM Employee WHERE EmployeeId = 3
SELECT * FROM Employee WHERE EmployeeId = 5
在三次数据库往返中。根据定义,这比这要慢:

SELECT * FROM Employee WHERE EmployeeId IN (1, 3, 5)
如果数据计数很大,WHERE子句的执行速度比FIND慢。这是事实

不,不是。查找不是SQL。它转换为其中PK_COL=任意数量的主键列的值和一条记录的值。Find具有params参数的原因是复合主键

因此,答案确实回答了您的问题,并且完全符合您的要求:

var primaryKeys = new int[] { 1, 3, 5 };

var employees = dbContext.Employee.Where(e => primaryKeys.Contains(e.EmployeeId));
这意味着。。。如上图所示

我的问题是如何使用FIND扩展方法获取多个记录

你不能;“查找”会找到一条记录,这不是您想要的

因为在操作中执行比查找操作慢

不,不是。您当前的代码执行以下操作:

SELECT * FROM Employee WHERE EmployeeId = 1
SELECT * FROM Employee WHERE EmployeeId = 3
SELECT * FROM Employee WHERE EmployeeId = 5
在三次数据库往返中。根据定义,这比这要慢:

SELECT * FROM Employee WHERE EmployeeId IN (1, 3, 5)
如果数据计数很大,WHERE子句的执行速度比FIND慢。这是事实

不,不是。查找不是SQL。它转换为其中PK_COL=任意数量的主键列的值和一条记录的值。Find具有params参数的原因是复合主键

因此,答案确实回答了您的问题,并且完全符合您的要求:

var primaryKeys = new int[] { 1, 3, 5 };

var employees = dbContext.Employee.Where(e => primaryKeys.Contains(e.EmployeeId));

这意味着。。。如上图所示。

@CodeCaster:IN-operation执行速度比。查找您知道这一点吗?您不能这样做。如果您只加载几个对象,请使用IN语句。如果加载上百/千个对象,最好的方法是使用联接。不幸的是,您无法将数据库集与内存中的表连接起来,因此您必须编写一个存储过程,当然您将丢失对象跟踪我认为这是一个有效的问题。。。使用find将使您能够利用EF缓存。。。所以它比IN/Contains调用更有利。。。当然,假设参数是实体的PKs。EF应该支持一种在一次数据库调用中通过PK查找和缓存多个实体的方法,这似乎非常合理。@CodeCaster:in操作的执行速度比。find您知道吗?您不能这样做。如果您只加载几个对象,请使用in语句。如果加载上百/千个对象,最好的方法是使用联接。不幸的是,您无法将数据库集与内存中的表连接起来,因此您必须编写一个存储过程,当然您将丢失对象跟踪我认为这是一个有效的问题。。。使用find将使您能够利用EF缓存。。。所以它比IN/Contains调用更有利。。。当然,假设参数是实体的PKs。EF应该支持通过PK在单个数据库调用中查找和缓存多个实体,这似乎非常合理。谢谢。请你用不同的方式思考,而不是去哪里,去哪里,你需要用不同的方式思考。你在想哪里是慢的,但它不是。别忘了,在这个过程中元素的数量是有限制的IN@GeorgeVovos:我无法理解。别忘了“in”中的元素数量是有限制的。请您向我简要介绍一下……。@B.Balamanigandan,谢谢。请你用不同的方式思考,而不是去哪里,去哪里,你需要用不同的方式思考。你在想哪里是慢的,但它不是。别忘了,在这个过程中元素的数量是有限制的IN@GeorgeVovos:我无法理解。别忘了“in”中的元素数量是有限制的。你能简要地告诉我……。@B.Balamanigandan吗