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

标签 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操作慢。

最佳答案

我的问题是如何使用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

关于c# - 通过传递主键列表在Entity Framework中使用Find方法的多个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41933635/

相关文章:

linq - ef cf linq 填充被忽略的属性

c# - 在 DataTable 中分组 Column sum

c# - "this"从基类调用派生类对象时的关键字类型

mysql - 使用 Entity Framework 获取唯一行

asp.net-mvc - Microsoft MVC 中的服务层和存储库设计

c# - LINQ 中的连接/联合表

c# - Form.Parent 和 StartPosition.CenterParent

c# - ASP.NET MVC3 - 如何从另一个 Controller 提供 View()

c# - Entity Framework 6 多表对一外键关系代码先

c# - Entity Framework 5 预加载父属性