Bagikan melalui


Eksekusi Jarak Jauh vs. Eksekusi 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. Kelas EntitySet<TEntity> di LINQ ke SQL 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.

Pelaksanaan Lokal

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

EntitySet<TEntity> Jika 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 memberikan 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 Tipe ke Generic IEnumerable.

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. List<T> metode 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