2014-01-06 4 views
0

Итак, у меня есть инфраструктура сущности 5. У меня есть таблица Customers в базе данных. Что было бы самым эффективным способом получить клиентов от данного почтового индекса, например, 94023? У меня есть это:Entity framework получить клиентов по почтовому индексу

var customersOfLosAltos = 
    (myDbContext.CreateObjectSet<Customer>()).Where(c=>c.Zip == "94023"); 

Но, интуитивно, что кажется довольно неэффективно, потому что, как я понимаю, он в основном получает все клиенты из источника данных, а затем отфильтровать его по данной молнии. Может быть, все в порядке, если у меня будет только несколько сотен клиентов, что, если у меня будет миллион клиентов?

Любые мысли? Благодарю.

+0

Таким образом, это создает только запрос и не будет выполняться немедленно? – Stack0verflow

+0

Скорость зависит от того, как и как индексируется индекс zipcode в базе данных. – danludwig

ответ

5

Как я понимаю, он в основном извлекает всех клиентов из источника данных, а затем отфильтровывает его по заданному почтовому индексу.

Ваше понимание неверное. рамки сущности превращает ваш код для запроса 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() , ect.)

select LastName from Customer where Zip = '94023' 
+0

ОК, понял. Это отвечает на мой вопрос. Благодарю. – Stack0verflow

Смежные вопросы