所以我已经通过实体框架5设置了。我在数据库中有一个Customers表。获得给定邮政编码的客户最有效的方法是什么?例如94023?我有这个:
var customersOfLosAltos =
(myDbContext.CreateObjectSet<Customer>()).Where(c=>c.Zip == "94023");
但是,直观地说,这似乎效率很低,因为据我所知,它基本上从数据源中检索所有客户,然后通过给定的zip过滤掉它。如果我只有几百个客户,那可能没问题,如果我有一百万客户怎么办?
有什么想法?感谢。
答案 0 :(得分:5)
据我所知,它基本上从数据源中检索所有客户,然后通过给定的zip过滤掉它。
你的理解是错误的。实体框架将您的代码转换为SQL查询,因此服务器实际返回的是查询的结果
select * from Customer where Zip = '94023'
如果您将代码更改为
var customers = myDbContext.CreateObjectSet<Customer>().ToList();
var customersOfLosAltos= customers.Where(c=>c.Zip == "94023");
然后因为.ToList()
它现在对数据库进行了未经过滤的查询,然后在客户端上的内存过滤器中对所需的客户进行了过滤。这就是为什么您希望在获得结果之前尽可能长时间地将查询保持为IQueryable
的原因,因为您对查询所做的任何调整或更改都会传播回在服务器上执行的查询。
为了提高查询效率,您可以添加Select
子句
var lastNamesOfCustomersOfLosAltos = (myDbContext.CreateObjectSet<Customer>())
.Where(c=>c.Zip == "94023")
.Select(c=>c.LastName);
SQL服务器现在执行查询(当您通过ToList()
或foreach
或.AsEnumerable()
等方式检索结果时)。
select LastName from Customer where Zip = '94023'