Я только начал изучать LINQ to SQL, и до сих пор я впечатлен простотой использования и хорошей производительностью.Вопрос об основах LINQ to SQL
Я привык думать, что при выполнении LINQ запросов как
from Customer in DB.Customers where Customer.Age > 30 select Customer
LINQ получает все клиент из базы данных («SELECT * FROM Клиентов»), перемещает их в массив Customers, а затем делает поиск в том, что Массив с использованием методов .NET. Это очень неэффективно, что, если в базе данных сотни тысяч клиентов? Создание таких больших запросов SELECT приведет к удалению веб-приложения.
Теперь испытав как на самом деле быстро LINQ к SQL, я начинаю подозревать, что при выполнении этого запроса я просто написал, LINQ как-то преобразует его в строку SQL Query
SELECT * FROM Customers WHERE Age > 30
И только в случае необходимости он будет запустите запрос.
Так что мой вопрос: я прав? И когда действительно выполняется запрос?
Причина, по которой я прошу, заключается не только в том, что я хочу понять, как она работает, чтобы создавать хорошие оптимизированные приложения, а потому, что я столкнулся со следующей проблемой.
У меня есть 2 стола, одна из них - Книги, другая - информация о том, сколько книг было продано в определенные дни. Моя цель - выбрать книги, которые имели не менее 50 продаж в день за последние 10 дней. Это делается с помощью этого простого запроса:
from Book in DB.Books where (from Sale in DB.Sales where Sale.SalesAmount >= 50 && Sale.DateOfSale >= DateTime.Now.AddDays(-10) select Sale.BookID).Contains(Book.ID) select Book
Дело в том, что я должен использовать проверки участие в нескольких запросов, и я решил создать массив с идентификаторами всех популярных книг:
var popularBooksIDs = from Sale in DB.Sales where Sale.SalesAmount >= 50 && Sale.DateOfSale >= DateTime.Now.AddDays(-10) select Sale.BookID;
НО когда я попытаюсь сделать запрос сейчас:
from Book in DB.Books where popularBooksIDs.Contains(Book.ID) select Book
Это не работает! Вот почему я думаю, что мы не можем использовать типы ярких ссылок в LINQ to SQL-запросах, например, мы не можем использовать их в реальном SQL. Мы должны создать простые вопросы, верно?
Для получения максимальной скорости я настоятельно рекомендую LINQPad. Трудно описать, но в основном это запросы LINQ, и вы можете легко увидеть, что происходит в фоновом режиме. Отлично подходит для тестирования новых запросов. http://www.linqpad.net/ – Steve