Sorgu Sonuçları

LINQ to Entities sorgusu komut ağaçlarına dönüştürüldükten ve yürütüldükten sonra sorgu sonuçları genellikle aşağıdakilerden biri olarak döndürülür:

  • Sıfır veya daha fazla türe sahip varlık nesnesi koleksiyonu veya kavramsal modeldeki karmaşık türlerin projeksiyonu.

  • Kavramsal model tarafından desteklenen CLR türleri.

  • Satır içi koleksiyonlar.

  • Anonim türler.

Sorgu veri kaynağında yürütülürken sonuçlar CLR türlerine dönüştürülür ve istemciye döndürülür. Tüm nesne gerçekleştirme, Entity Framework tarafından gerçekleştirilir. Entity Framework ile CLR arasında eşlenemez durumdan kaynaklanan hatalar nesne gerçekleştirme sırasında özel durumların atılmasıyla sonuçlanır.

Sorgu yürütme ilkel kavramsal model türlerini döndürürse, sonuçlar tek başına olan ve Entity Framework ile bağlantısı kesilmiş CLR türlerinden oluşur. Ancak, sorgu tarafından temsil edilen ObjectQuery<T>, türü belirtilen varlık nesnelerinin bir koleksiyonunu döndürürse, bu türler nesne bağlamı tarafından izlenir. Tüm nesne davranışı (alt/üst koleksiyonlar, değişiklik izleme, çok biçimlilik vb.) Entity Framework'te tanımlandığı şekildedir. Bu işlev, Entity Framework'te tanımlandığı gibi kapasitesinde kullanılabilir. Daha fazla bilgi için bkz . Nesnelerle Çalışma.

Sorgulardan döndürülen yapı türleri (anonim türler ve null atanabilir karmaşık türler gibi) değerli olabilir null . EntityCollection<TEntity> Döndürülen varlığın özelliği de değerli olabilirnull. Bu, öğe içermeyen bir varlığı çağırmak gibi FirstOrDefault değerli bir ObjectQuery<T> varlığın null koleksiyon özelliğini yansıtmaktan kaynaklanabilir.

Bazı durumlarda, bir sorgu yürütülürken gerçekleştirilmiş bir sonuç oluşturuyor gibi görünebilir, ancak sorgu sunucuda yürütülür ve varlık nesnesi CLR'de hiçbir zaman gerçekleşmez. Nesne gerçekleştirmenin yan etkilerine bağlıysanız bu sorunlara neden olabilir.

Aşağıdaki örnek, MyContactözelliği olan özel bir LastName sınıfını içerir. LastName Özelliği ayarlandığında, bir count değişken artırılır. Aşağıdaki iki sorguyu yürütürseniz, ilk sorgu artarken ikinci sorgu artmayacak count . Bunun nedeni, ikinci sorguda LastName özelliğin sonuçlardan yansıtılmış olması ve depoda sorgunun MyContact yürütülmesi gerekmediğinden sınıfın hiçbir zaman oluşturulmamasıdır.

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