В LINQ для выполнения составных запросов быстрее вызывать существующие функции или писать весь запрос? - PullRequest
0 голосов
/ 13 февраля 2012

Мне нужно выполнять запросы в модели ADO.NET с помощью LINQ. У меня есть класс EF для базы данных моего интернет-магазина WebStoreEntities, и мне нужно найти все товары в таблице Products, на которые в данный момент действует скидка. Экземпляр WebStoreEntities называется webStoreDB.

У меня уже есть метод, который запрашивает весь продукт из базы данных:

public IList<Products> GetAllProducts()
{
    return webStoreDB.Products.ToList();
}

Для того, чтобы написать метод с подписью IList<Products> GetAllDiscountProducts(), который извлекает все товары со скидкой, быстрее написать:

return webStoreDB.Products.Where(m => Equals(m.discounted, 1)).ToList();

или

return GetAllProducts().Where(m => Equals(m.discounted, 1)).ToList();

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Linq использует потоковое и отложенное выполнение, поэтому до вызова ToList() ваш запрос не был выполнен в контексте вашей базы данных.

(Вы должны знать, что используете здесь linq-to-entity, поэтому ваш linq составляется в SQL-запрос и затем выполняется)

GetAllProducts() звонки ToList():

В этот момент sql отправляется в вашу базу данных, выполняется и затем возвращается в объекты памяти. Эти объекты в памяти затем фильтруются этой частью: .Where(m => Equals(m.discounted, 1)).ToList();
(И теперь это часть Linq-To-Objects)

Это ОГРОМНАЯ загвоздка, потому что он выполнит SQL-запрос для возврата ВСЕХ продуктов (=> SELECT * FROM PRODUCTS). И если у вас есть миллион продуктов, все они будут возвращены в память !!

Я рекомендую HRH Jon Skeets Edulinq series , это должно дать вам хорошее понимание отложенного исполнения. Особенно статья о .Where();

3 голосов
/ 13 февраля 2012
return webStoreDB.Products.Where(m => Equals(m.discounted, 1)).ToList();

Это быстрее, потому что фильтрация выполняется в базе данных, где

return GetAllProducts().Where(m => Equals(m.discounted, 1)).ToList();

фильтрация будет производиться в памяти клиента. В основном операторы LINQ, выдаваемые для интерфейса IQueriable, будут преобразованы в SQL, когда поставщиком является какая-либо реляционная база данных.

Но если вы используете LINQ с интерфейсом IEnumerable, запрос выполняется в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...