Résultats de requêteQuery Results

Une fois une requête LINQ to Entities est convertie en arborescences de commandes et exécutée, les résultats de requête sont généralement retournés sous une des opérations suivantes :After a LINQ to Entities query is converted to command trees and executed, the query results are usually returned as one of the following:

  • une collection de zéro, un ou plusieurs objets entité typés ou une projection de types complexes dans le modèle conceptuel ;A collection of zero or more typed entity objects or a projection of complex types in the conceptual model.

  • des types CLR pris en charge par le modèle conceptuel ;CLR types supported by the conceptual model.

  • Collections inline.Inline collections.

  • Types anonymes.Anonymous types.

Lorsque la requête a été exécutée sur la source de données, les résultats sont matérialisés en types CLR et retournés au client.When the query has executed against the data source, the results are materialized into CLR types and returned to the client. La matérialisation d'objets est entièrement assurée par Entity FrameworkEntity Framework.All object materialization is performed by the Entity FrameworkEntity Framework. Les erreurs qui résultent d'une impossibilité d'effectuer un mappage entre Entity FrameworkEntity Framework et le CLR provoquent la levée d'exceptions pendant la matérialisation d'objets.Any errors that result from an inability to map between the Entity FrameworkEntity Framework and the CLR will cause exceptions to be thrown during object materialization.

Si l'exécution de la requête retourne des types de modèle conceptuel primitifs, les résultats se composent de types CLR autonomes et déconnectés d'Entity FrameworkEntity Framework.If the query execution returns primitive conceptual model types, the results consist of CLR types that are stand-alone and disconnected from the Entity FrameworkEntity Framework. Toutefois, si la requête retourne une collection d’objets entité typés, représentée par ObjectQuery<T>, ces types sont suivis par le contexte d’objet.However, if the query returns a collection of typed entity objects, represented by ObjectQuery<T>, those types are tracked by the object context. Tous les comportements d’objet (par exemple, les collections enfants/parentes, le suivi des modifications, le polymorphisme, etc.) sont définies dans le Entity FrameworkEntity Framework.All object behavior (such as child/parent collections, change tracking, polymorphism, and so on) are as defined in the Entity FrameworkEntity Framework. Ces fonctionnalités peuvent être utilisées en leur qualité, comme défini dans l'Entity FrameworkEntity Framework.This functionality can be used in its capacity, as defined in the Entity FrameworkEntity Framework. Pour plus d’informations, consultez utilisation d’objets.For more information, see Working with Objects.

Les types Struct retournés par les requêtes (tels que les types anonymes et les types complexes Nullable) peuvent être de valeur null.Struct types returned from queries (such as anonymous types and nullable complex types) can be of null value. Une propriété EntityCollection<TEntity> d'une entité retournée peut également être de valeur null.An EntityCollection<TEntity> property of a returned entity can also be of null value. Cela peut être le résultat de la projection de la propriété de collection d'une entité de valeur null, par exemple, en cas d'appel de FirstOrDefault sur un objet ObjectQuery<T> qui n'a pas d'éléments.This can result from projecting the collection property of an entity that is of null value, such as calling FirstOrDefault on an ObjectQuery<T> that has no elements.

Dans certains cas, une requête peut sembler générer un résultat matérialisé pendant son exécution, mais il s'avère qu'elle est exécutée sur le serveur et que l'objet entité n'est jamais matérialisé dans le CLR.In certain situations, a query might appear to generate a materialized result during its execution, but the query will be executed on the server and the entity object will never be materialized in the CLR. Cela peut être la cause de problèmes si vous êtes dépendant des effets secondaires de la matérialisation d'objets.This can cause problems if you are depending on side effects of object materialization.

L'exemple suivant contient une classe personnalisée, MyContact, avec une propriété LastName.The following example contains a custom class, MyContact, with a LastName property. Lorsque la propriété LastName est définie, une variable count est incrémentée.When the LastName property is set, a count variable is incremented. Si vous exécutez les deux requêtes suivantes, la première incrémente count mais pas la deuxième.If you execute the two following queries, the first query will increment count while the second query will not. Cela est dû au fait que dans la deuxième requête, la propriété LastName est projetée à partir des résultats et que la classe MyContact n'est jamais créée, car elle n'est pas utile à l'exécution de la requête sur le magasin.This is because in the second query the LastName property is projected from the results and the MyContact class is never created, because it is not required to execute the query on the store.

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