2014-09-09 3 views
1

У меня сложный запрос, который выбирает из множества объектов из базы данных. но я столкнулся с проблемой производительности. данные занимают много времени, пока не будут извлечены, в отличие от sql, это займет всего несколько секунд.LINQ выберите данные из многих таблиц

Таблица:

Product 
productPrice (it contains more than 20k rows) 
Category 
Store 

запрос:

 var grid = from p in db.Products.ToList() 
        from productPrice in db.ProductPrices.ToList() 
        where p.ProductID == productPrice.ProductID 
        from c in db.Categories.ToList() 
        where c.CategoryID == p.ProductCategoryID 
        where c.CategoryID == subCategoryID 
        from u in db.Users.ToList() 
        where u.UserID == productPrice.UserID 
        where u.UserID == storeID 
        select new 
        { 
         ProductID = p.ProductID, 
         StoreName = u.Name, 
         ProductCateogry = c.CategoryName, 
         CategoryHsCode = c.CategoryHsCode, 
         ProductName = p.ProductName, 
         ProductBarcode = p.ProductBarcode, 
         Price = productPrice.Price, 
         PriceUnit = productPrice.Unit, 
         LoggedDate = productPrice.LoggedDate 
        }; 

есть какие-либо проблемы с запросом или объект кадра работой выбрать все данные, то он фильтрует его?

+4

Удалите все «ToList», которые в основном загружают вашу базу данных полностью в память. _before_ «Where» фильтрует записи. –

+0

'ToList' должен использоваться только в конце запроса, если вы хотите получить« Список ». –

ответ

2

Удалить все ToList, который в основном загружает вашу базу данных полностью в память доWhere фильтрует записи. ToList создает список из таблицы.

var grid = from p in db.Products 
      from productPrice in db.ProductPrices 
      where p.ProductID == productPrice.ProductID 
      from c in db.Categories 
      where c.CategoryID == p.ProductCategoryID 
      where c.CategoryID == subCategoryID 
      from u in db.Users 
      where u.UserID == productPrice.UserID 
      where u.UserID == storeID 
      select new 
      { 
       ProductID = p.ProductID, 
       StoreName = u.Name, 
       ProductCateogry = c.CategoryName, 
       CategoryHsCode = c.CategoryHsCode, 
       ProductName = p.ProductName, 
       ProductBarcode = p.ProductBarcode, 
       Price = productPrice.Price, 
       PriceUnit = productPrice.Unit, 
       LoggedDate = productPrice.LoggedDate 
      }; 

Если вы хотите получить список в качестве конечного результата (хотя я бы инициализировать пользовательский тип вместо анонимного типа):

var gridList = grid.ToList(); // loads only the filtered records into memory 

Используя ToList в запросе вы также с помощью Linq-To-Objects который не может воспользоваться индексами базы данных или оптимизациями. Таким образом, таблицы больше не будут связаны с эффективным JOIN, но с inefficient (in-memory) Where с использованием декартова продукта.

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