通过传递主键列表在Entity Framework中使用Find方法的多个记录

B.B*_*dan 1 c# linq entity-framework

Contact在SQL Server中有一个表,我在我的C#控制台应用程序中使用Entity Framework映射表:

EmployeeId  FirstName   LastName
--------------------------------
1           Ram         Kumar
2           Mohan       Raj
3           Aravind     Swaamy
4           Ajay        Kumar
5           Ram         Raj
Run Code Online (Sandbox Code Playgroud)

我需要获取1,3,5(EmployeeId)的记录

目前我正在以下列方式做

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);
Run Code Online (Sandbox Code Playgroud)

Find通过传递主键值列表来帮助我如何使用方法获取记录列表.

有些人认为这个问题是如何在实体框架中进行"in"查询的重复.不,这绝对是错的.我的问题是如何使用Find扩展方法获取多个记录.因为IN操作执行速度比Find操作慢.

Cod*_*ter 8

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

你不能; Find()找到一条记录,这不是你想要的.

因为IN操作执行比FIND操作慢.

不,这不对.您当前的代码执行此操作:

SELECT * FROM Employee WHERE EmployeeId = 1
SELECT * FROM Employee WHERE EmployeeId = 3
SELECT * FROM Employee WHERE EmployeeId = 5
Run Code Online (Sandbox Code Playgroud)

在三个数据库往返中.根据定义,这比这慢:

SELECT * FROM Employee WHERE EmployeeId IN (1, 3, 5)
Run Code Online (Sandbox Code Playgroud)

如果数据计数很大,则WHERE子句的执行速度比FIND慢.这是事实.

不,这不对.Find()不是SQL.它转换WHERE PK_COL=value为一个记录的任意数量的主键列和值.Find()有一个params参数的原因是因为复合主键.

因此,我之前链接副本确实回答了您的问题并完全符合您的要求:

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

var employees = dbContext.Employee.Where(e => primaryKeys.Contains(e.EmployeeId));
Run Code Online (Sandbox Code Playgroud)

这转换为WHERE ... IN上面显示的.

  • 不,**你需要以不同的方式去思考.你在想什么是慢的,但事实并非如此. (2认同)