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

时间:2017-01-30 10:30:05

标签: c# entity-framework linq

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

EmployeeId  FirstName   LastName
--------------------------------
1           Ram         Kumar
2           Mohan       Raj
3           Aravind     Swaamy
4           Ajay        Kumar
5           Ram         Raj

我需要获取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);

请通过传递主键值列表,帮助我使用Find方法获取记录列表。

有些人认为这个问题与How to do an "in" query in entity framework?重复。不,这绝对是错的。我的问题是如何使用Find扩展方法获取多个记录。因为IN操作执行速度比Find操作慢。

1 个答案:

答案 0 :(得分:7)

  

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

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

  

因为IN操作的执行速度比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慢。这是事实。

不,不是。 Find()不是SQL。对于任何数量的主键列和一个记录的值,它都会转换为WHERE PK_COL=valueFind()具有params参数的原因是复合主键。

因此,duplicate I linked to before 回答您的问题并完全符合您的要求:

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

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

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