Bagikan melalui


Eksekusi Jarak Jauh vs. Lokal

Anda dapat memutuskan untuk menjalankan kueri Anda dari jarak jauh (yaitu, mesin database menjalankan kueri terhadap database) atau secara lokal (LINQ ke SQL menjalankan kueri terhadap cache lokal).

Eksekusi jarak jauh

Pertimbangkan kueri berikut:

            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

Jika database Anda memiliki ribuan baris pesanan, Anda tidak ingin mengambil semuanya untuk memproses subset kecil. Dalam LINQ ke SQL, kelas EntitySet<TEntity> mengimplementasikan antarmuka IQueryable. Pendekatan ini memastikan bahwa kueri tersebut dapat dijalankan dari jarak jauh. Dua manfaat utama mengalir dari teknik ini:

  • Data yang tidak perlu tidak diambil.

  • Kueri yang dijalankan oleh mesin database sering kali lebih efisien karena indeks database.

Eksekusi Lokal

Dalam situasi lain, Anda mungkin ingin memiliki kumpulan lengkap entitas terkait di cache lokal. Untuk tujuan ini, EntitySet<TEntity> menyediakan metode Load untuk secara eksplisit memuat semua anggota EntitySet<TEntity>.

Jika EntitySet<TEntity> sudah dimuat, kueri berikutnya dijalankan secara lokal. Pendekatan ini membantu dengan dua cara:

  • Jika set lengkap harus digunakan secara lokal atau beberapa kali, Anda dapat menghindari kueri jarak jauh dan latensi terkait.

  • Entitas dapat diserialisasikan sebagai entitas lengkap.

Fragmen kode berikut menggambarkan bagaimana eksekusi lokal dapat diperoleh:

            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

Perbandingan

Kedua kemampuan ini menyediakan kombinasi opsi yang kuat: eksekusi jarak jauh untuk koleksi besar dan eksekusi lokal untuk koleksi kecil atau di mana koleksi lengkap diperlukan. Anda menerapkan eksekusi jarak jauh melalui IQueryable, dan eksekusi lokal terhadap koleksi dalam memori IEnumerable<T>. Untuk memaksa eksekusi lokal (yaitu, IEnumerable<T>), lihat Mengonversi Jenis menjadi IEnumerable Generik.

Kueri Terhadap Set yang Tidak Diurutkan

Perhatikan perbedaan penting antara koleksi lokal yang mengimplementasikan List<T> dan koleksi yang menyediakan kueri jarak jauh yang dijalankan terhadap set yang tidak diurutkan dalam database relasional. Metode List<T> seperti yang menggunakan nilai indeks memerlukan semantik daftar, yang biasanya tidak dapat diperoleh melalui kueri jarak jauh terhadap set yang tidak diurutkan. Untuk alasan ini, metode tersebut secara implisit memuat EntitySet<TEntity> untuk memungkinkan eksekusi lokal.

Lihat juga