Share via


Hasil Kueri

Setelah kueri LINQ ke Entitas diubah menjadi pohon perintah dan dijalankan, hasil kueri biasanya dikembalikan sebagai salah satu dari berikut ini:

  • Kumpulan dari nol atau lebih objek entitas yang diketik atau proyeksi jenis kompleks dalam model konseptual.

  • Jenis CLR didukung oleh model konseptual.

  • Koleksi sebaris.

  • Jenis anonim.

Ketika kueri telah dijalankan terhadap sumber data, hasilnya diwujudkan menjadi jenis CLR dan dikembalikan ke klien. Semua materialisasi objek dilakukan oleh Entity Framework. Kesalahan apa pun yang dihasilkan dari ketidakmampuan untuk memetakan antara Entity Framework dan runtime bahasa umum akan menyebabkan pengecualian dimunculkan selama materialisasi objek.

Jika eksekusi kueri mengembalikan jenis model konseptual primitif, hasilnya terdiri dari jenis CLR yang berdiri sendiri dan terputus dari Entity Framework. Namun, jika kueri mengembalikan kumpulan objek entitas yang diketik, yang diwakili oleh ObjectQuery<T>, jenis tersebut dilacak oleh konteks objek. Semua perilaku objek (seperti koleksi anak/induk, pelacakan perubahan, polimorfisme, dan sebagainya) seperti yang didefinisikan dalam Entity Framework. Fungsi ini dapat digunakan dalam kapasitasnya, seperti yang didefinisikan dalam Entity Framework. Untuk informasi selengkapnya, baca Menggunakan Objek.

Jenis struktur yang dikembalikan dari kueri (seperti jenis anonim dan jenis kompleks yang dapat dibatalkan) dapat bernilai null. Properti EntityCollection<TEntity> dari entitas yang dikembalikan juga dapat bernilai null. Ini dapat dihasilkan dari memproyeksikan properti kumpulan entitas yang bernilai null, seperti memanggil FirstOrDefault pada ObjectQuery<T> yang tidak memiliki elemen.

Dalam situasi tertentu, kueri mungkin muncul untuk menghasilkan hasil yang terwujud selama eksekusinya, tetapi kueri akan dijalankan di server dan objek entitas tidak akan pernah dimaterialisasikan di CLR. Hal ini dapat menyebabkan masalah jika Anda bergantung pada efek samping dari materialisasi objek.

Contoh berikut berisi kelas kustom, MyContact, dengan properti LastName. Saat properti LastName diatur, variabel count akan bertambah. Jika Anda menjalankan dua kueri berikut, kueri pertama akan bertambah count sedangkan kueri kedua tidak. Ini karena dalam kueri kedua, properti LastName diproyeksikan dari hasil dan kelas MyContact tidak pernah dibuat, karena tidak diperlukan untuk menjalankan kueri di toko.

public static int count = 0;

static void Main(string[] args)
{
    using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
    {

        var query1 = AWEntities
           .Contacts
           .Where(c => c.LastName == "Jones")
           .Select(c => new MyContact { LastName = c.LastName });

        // Execute the first query and print the count.
        query1.ToList();
        Console.WriteLine("Count: " + count);

        //Reset the count variable.
        count = 0;

        var query2 = AWEntities
           .Contacts
           .Where(c => c.LastName == "Jones")
           .Select(c => new MyContact { LastName = c.LastName })
           .Select(my => my.LastName);

        // Execute the second query and print the count.
        query2.ToList();
        Console.WriteLine("Count: " + count);
    }

    Console.WriteLine("Hit enter...");
    Console.Read();
}
Public count As Integer = 0

Sub Main()

    Using AWEntities As New AdventureWorksEntities()

        Dim query1 = AWEntities.Contacts _
        .Where(Function(c) c.LastName = "Jones") _
        .Select(Function(c) New MyContact With {.LastName = c.LastName})

        ' Execute the first query and print the count.
        query1.ToList()
        Console.WriteLine("Count: " & count)

        ' Reset the count variable.
        count = 0

        Dim query2 = AWEntities _
        .Contacts() _
        .Where(Function(c) c.LastName = "Jones") _
        .Select(Function(c) New MyContact With {.LastName = c.LastName}) _
        .Select(Function(x) x.LastName)

        ' Execute the second query and print the count.
        query2.ToList()
        Console.WriteLine("Count: " & count)

    End Using
End Sub
public class MyContact
{

    String _lastName;

    public string LastName
    {
        get
        {
            return _lastName;
        }

        set
        {
            _lastName = value;
            count++;
        }
    }
}
Public Class MyContact

    Private _lastName As String

    Public Property LastName() As String
        Get
            Return _lastName
        End Get

        Set(ByVal value As String)
            _lastName = value
            count += 1
        End Set
    End Property

End Class