Gewusst wie: Sortieren zweier mit dem 'UNION'-Befehl zusammengefasster Abfragen (Entity Framework)

In diesem Thema wird gezeigt, wie die Ergebnisse von zwei Abfragen zu einem einzelnen Resultset kombiniert werden können, und wie anschließend das Resultset sortiert werden kann. Dasselbe Beispiel wird unter Verwendung der folgenden Entity Framework-Abfragetechnologien dargestellt:

  • Entity SQL mit ObjectQuery<T>

  • Abfrage-Generator-Methoden von ObjectQuery<T>

Die Beispiele in diesem Thema beruhen auf dem AdventureWorks Sales-Modell (EDM). Um den Code in diesen Beispielen auszuführen, müssen Sie Ihrem Projekt bereits das "AdventureWorks Sales"-Modell hinzugefügt und das Projekt für die Verwendung von Entity Framework konfiguriert haben. Führen Sie dazu die Verfahren in Gewusst wie: Manuelles Konfigurieren eines Entity Framework-Projekts und Gewusst wie: Manuelles Definieren eines Entity Data Model (Entity Framework) aus. Sie können auch den Assistenten für Entity Data Model zum Definieren des "AdventureWorks Sales"-Modells verwenden. Weitere Informationen finden Sie unter Gewusst wie: Verwenden des Assistenten für Entity Data Model (Entity Framework).

Beispiel

Es folgt das Entity SQL-Beispiel: Um Entity SQL-Abfragen zusammenzufassen und zu sortieren, muss Schachtelung verwendet werden. In Entity SQL müssen geschachtelte Abfragen in Klammern eingeschlossen werden.

Using advWorksContext As AdventureWorksEntities = New AdventureWorksEntities
    Dim esqlQuery As String = "SELECT P2.Name, P2.ListPrice " & _
        " FROM ((SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice " & _
        " FROM AdventureWorksEntities.Product as P1 " & _
        " where P1.Name like 'A%') " & _
        " union all " & _
        " (SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice  " & _
        " FROM AdventureWorksEntities.Product as P1 " & _
        " WHERE P1.Name like 'B%') " & _
        " ) as P2 " & _
        " ORDER BY P2.Name"
    Try
        Dim objQuery As New ObjectQuery(Of DbDataRecord)(esqlQuery, advWorksContext)
        For Each rec As DbDataRecord In objQuery
            Console.WriteLine("Name: {0} ListPrice: {1}", rec.Item(0), rec.Item(1))
        Next
    Catch ex As EntityException
        Console.WriteLine(ex.ToString())
    Catch ex As InvalidOperationException
        Console.WriteLine(ex.ToString())
    End Try
End Using
using (AdventureWorksEntities advWorksContext =
    new AdventureWorksEntities())
{
    String esqlQuery = @"SELECT P2.Name, P2.ListPrice
        FROM ((SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice 
            FROM AdventureWorksEntities.Product as P1
            where P1.Name like 'A%')
        union all
            (SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice 
            FROM AdventureWorksEntities.Product as P1
            WHERE P1.Name like 'B%')
        ) as P2
        ORDER BY P2.Name";
    try
    {
        foreach (DbDataRecord rec in
            new ObjectQuery<DbDataRecord>(esqlQuery, advWorksContext))
        {
            Console.WriteLine("Name: {0}; ListPrice: {1}", rec[0], rec[1]);
        }
    }
    catch (EntityException ex)
    {
        Console.WriteLine(ex.ToString());
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

Dies ist das Beispiel für die Abfrage-Generator-Methode.

Using advWorksContext As New AdventureWorksEntities()
    Dim query As ObjectQuery(Of DbDataRecord) = _
        advWorksContext.Product.Select("it.Name, it.ProductID As Pid, it.ListPrice") _
        .Where("it.Name LIKE 'A%'").Union(advWorksContext.Product _
        .Select("it.Name, it.ProductID As Pid, it.ListPrice") _
        .Where("it.Name LIKE 'B%'")).Select("it.Name, it.ListPrice").OrderBy("it.Name")

    Try
        For Each rec As DbDataRecord In query
            Console.WriteLine("Name:{0}ListPrice: {1}", rec(0), rec(1))
        Next
    Catch ex As EntitySqlException
        Console.WriteLine(ex.ToString())
    End Try
End Using
using (AdventureWorksEntities advWorksContext =
    new AdventureWorksEntities())
{
    ObjectQuery<DbDataRecord> query = 
        advWorksContext.Product.Select("it.Name, it.ProductID As Pid, it.ListPrice")
        .Where("it.Name LIKE 'A%'").Union(advWorksContext.Product
        .Select("it.Name, it.ProductID As Pid, it.ListPrice")
        .Where("it.Name LIKE 'B%'")).Select("it.Name, it.ListPrice").OrderBy("it.Name");

        try
        {
            foreach (DbDataRecord rec in query)
            {
                Console.WriteLine("Name: {0}; ListPrice: {1}", rec[0], rec[1]);
            }
        }
        catch (EntitySqlException ex)
        {
            Console.WriteLine(ex.ToString());
        }
}

Siehe auch

Weitere Ressourcen

Abfragen eines Entity Data Model (Entity Framework-Aufgaben)