Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Вы можете выбрать удаленное выполнение запросов (то есть ядро СУБД выполняет запрос к базе данных) или локально (LINQ to SQL выполняет запрос к локальному кэшу).
Удаленное выполнение
Обратите внимание на следующий запрос:
Northwnd db = new Northwnd(@"northwnd.mdf");
Customer c = db.Customers.Single(x => x.CustomerID == "19283");
foreach (Order ord in
c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
// Do something.
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim c As Customer = _
(From cust In db.Customers _
Where cust.CustomerID = 19283).First()
Dim orders = From ord In c.Orders _
Where ord.ShippedDate.Value.Year = 1998
For Each nextOrder In orders
' Do something.
Next
Если в базе данных есть тысячи строк заказов, их не нужно извлекать для обработки небольшого подмножества. В LINQ to SQL EntitySet<TEntity> класс реализует IQueryable интерфейс. Этот подход гарантирует, что такие запросы можно выполнять удаленно. Два основных преимущества этого метода:
Ненужные данные не извлекаются.
Запрос, выполняемый ядром СУБД, часто эффективнее из-за индексов базы данных.
Локальное выполнение
В других ситуациях может потребоваться полный набор связанных сущностей в локальном кэше. Для этого EntitySet<TEntity> предоставляет метод Load, чтобы явно загрузить всех членов EntitySet<TEntity>.
Если EntitySet<TEntity> уже загружено, последующие запросы выполняются локально. Этот подход помогает двумя способами:
Если полный набор должен использоваться локально или несколько раз, можно избежать удаленных запросов и связанных задержек.
Сущность можно сериализовать как полную сущность.
В следующем фрагменте кода показано, как можно получить локальное выполнение:
Northwnd db = new Northwnd(@"northwnd.mdf");
Customer c = db.Customers.Single(x => x.CustomerID == "19283");
c.Orders.Load();
foreach (Order ord in
c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
// Do something.
}
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim c As Customer = _
(From cust In db.Customers _
Where cust.CustomerID = 19283).First
c.Orders.Load()
Dim orders = From ord In c.Orders _
Where ord.ShippedDate.Value.Year = 1998
For Each nextOrder In orders
' Do something.
Next
Сравнение
Эти две возможности обеспечивают мощное сочетание параметров: удаленное выполнение для больших коллекций и локальное выполнение для небольших коллекций или где требуется полная коллекция. Вы реализуете удаленное выполнение с помощью IQueryable, и локальное выполнение против коллекции в памяти IEnumerable<T>. Чтобы принудительно выполнить локально (т. е. IEnumerable<T>), см. "Преобразование типа в обобщенный IEnumerable".
Запросы к неупорядоченным наборам
Обратите внимание на важное различие между локальной коллекцией, реализующей List<T> и коллекцию, которая предоставляет удаленные запросы, выполняемые для неупорядоченных наборов в реляционной базе данных. List<T> Такие методы, как те, которые используют значения индекса, требуют семантики списка, которые обычно невозможно получить через удаленный запрос к неупорядоченном набору. По этой причине такие методы неявно загружают EntitySet<TEntity> для обеспечения локального выполнения.