Výsledky dotazu

Jakmile se dotaz LINQ to Entities převede na stromy příkazů a spustí se, výsledky dotazu se obvykle vrátí jako jeden z následujících způsobů:

  • Kolekce nulových nebo více objektů entit typu nebo projekce složitých typů v koncepčním modelu.

  • Typy CLR podporované koncepčním modelem

  • Vložené kolekce.

  • Anonymní typy.

Když se dotaz provede vůči zdroji dat, výsledky se materializují do typů CLR a vrátí se klientovi. Všechna materializace objektů se provádí rozhraním Entity Framework. Všechny chyby, které vyplývají z nemožnosti mapování mezi Entity Framework a CLR, způsobí vyvolání výjimek během materializace objektů.

Pokud provádění dotazu vrátí primitivní koncepční typy modelu, výsledky se skládají z typů CLR, které jsou samostatné a odpojené od entity Framework. Pokud však dotaz vrátí kolekci objektů entit, které jsou reprezentovány ObjectQuery<T>, tyto typy jsou sledovány kontextem objektu. Veškeré chování objektů (například podřízené nebo nadřazené kolekce, sledování změn, polymorfismus atd.) jsou definovány v entity Frameworku. Tuto funkci lze použít v její kapacitě, jak je definováno v Entity Frameworku. Další informace naleznete v tématu Práce s objekty.

Typy struktury vrácené z dotazů (například anonymní typy a komplexní typy s možnou null hodnotou null) mohou být hodnoty. Vlastnost EntityCollection<TEntity> vrácené entity může být null také hodnota. To může mít za následek promítání vlastnosti kolekce entity, která je null hodnota, například volání FirstOrDefault na objekt ObjectQuery<T> , který nemá žádné prvky.

V některých situacích se dotaz může zdát, že během provádění vygeneruje materializovaný výsledek, ale dotaz se spustí na serveru a objekt entity nebude v CLR nikdy materializován. To může způsobit problémy, pokud jste v závislosti na vedlejší účinky materializace objektů.

Následující příklad obsahuje vlastní třídu , MyContacts LastName vlastností. LastName Při nastavení count vlastnosti se zvýší proměnná. Pokud spustíte následující dva dotazy, první dotaz se zvýší count , zatímco druhý dotaz nebude. Důvodem je to, že ve druhém dotazu LastName se vlastnost promítá z výsledků a MyContact třída se nikdy nevytvoří, protože není nutné spustit dotaz v úložišti.

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