Résultats de requête

Une fois qu’une requête LINQ to Entities a été convertie en arborescences de commandes puis exécutée, les résultats de la requête sont généralement retournés sous l’une des formes suivantes :

  • une collection de zéro, un ou plusieurs objets entité typés ou une projection de types complexes dans le modèle conceptuel ;

  • des types CLR pris en charge par le modèle conceptuel ;

  • Collections inline.

  • Types anonymes.

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. Toute matérialisation d’objets est effectuée par Entity Framework. Toute erreur qui résulte d’une impossibilité d’effectuer un mappage entre Entity Framework et le CLR lève une exception à lever pendant la matérialisation d’objets.

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 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. Tous les comportements d’objet (tel que les collections enfants/parentes, le suivi des modifications, le polymorphisme, etc.) sont tels que définis dans l’élément Entity Framework. Ces fonctionnalités peuvent être utilisées en leur qualité, comme défini dans l’Entity Framework. Pour plus d’informations, consultez Utilisation des objets.

Les types Struct retournés par les requêtes (tels que les types anonymes et les types complexes Nullable) peuvent être de valeur null. Une propriété EntityCollection<TEntity> d'une entité retournée peut également être de valeur null. 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.

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. Cela peut être la cause de problèmes si vous êtes dépendant des effets secondaires de la matérialisation d'objets.

L'exemple suivant contient une classe personnalisée, MyContact, avec une propriété LastName. Lorsque la propriété LastName est définie, une variable count est incrémentée. Si vous exécutez les deux requêtes suivantes, la première incrémente count mais pas la deuxième. 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.

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