我在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
操作慢。
答案 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=value
。 Find()
具有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
。