Бөлісу құралы:


Удаленное и локальное выполнение

Вы можете выбрать удаленное выполнение запросов (то есть ядро СУБД выполняет запрос к базе данных) или локально (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> для обеспечения локального выполнения.

См. также