Dela via


Frågeresultat

När en LINQ-till-entitetsfråga har konverterats till kommandoträd och körts returneras frågeresultatet vanligtvis som något av följande:

  • En samling med noll eller fler typinskrivna entitetsobjekt eller en projektion av komplexa typer i den konceptuella modellen.

  • CLR-typer som stöds av den konceptuella modellen.

  • Infogade samlingar.

  • Anonyma typer.

När frågan har körts mot datakällan materialiseras resultatet till CLR-typer och returneras till klienten. All objektmaterialisering utförs av Entity Framework. Eventuella fel som beror på en oförmåga att mappa mellan Entity Framework och CLR orsakar undantag som utlöses under objektmaterialisering.

Om frågekörningen returnerar primitiva konceptuella modelltyper består resultatet av CLR-typer som är fristående och frånkopplade från Entity Framework. Men om frågan returnerar en samling inskrivna entitetsobjekt, som representeras av ObjectQuery<T>, spåras dessa typer av objektkontexten. Alla objektbeteenden (till exempel underordnade/överordnade samlingar, ändringsspårning, polymorfism och så vidare) definieras i Entity Framework. Den här funktionen kan användas i dess kapacitet enligt definitionen i Entity Framework. Mer information finns i Arbeta med objekt.

Struct-typer som returneras från frågor (till exempel anonyma typer och nullbara komplexa typer) kan vara av null värde. En EntityCollection<TEntity> egenskap för en returnerad entitet kan också vara av null värde. Detta kan bero på att samlingsegenskapen projiceras för en entitet som är av null värde, till exempel anropar FirstOrDefault en ObjectQuery<T> som inte har några element.

I vissa situationer kan en fråga verka generera ett materialiserat resultat under körningen, men frågan körs på servern och entitetsobjektet materialiseras aldrig i CLR. Detta kan orsaka problem om du är beroende av biverkningar av objektmaterialisering.

Följande exempel innehåller en anpassad klass, MyContact, med en LastName egenskap. När egenskapen LastName har angetts ökas en count variabel. Om du kör följande två frågor ökar count den första frågan medan den andra frågan inte gör det. Det beror på att egenskapen i den andra frågan LastName projiceras från resultatet och MyContact att klassen aldrig skapas, eftersom det inte krävs för att köra frågan i arkivet.

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