Vergleichsausdrücke

Ein Vergleichsausdruck überprüft, ob ein konstanter Wert, ein Eigenschaftswert oder ein Methodenergebnis gleich, nicht gleich, größer oder kleiner als ein anderer Wert ist. Wenn ein bestimmter Vergleich für LINQ to Entities nicht gültig ist, wird eine Ausnahme ausgelöst. Alle Vergleiche, sowohl implizit als auch explizit, erfordern, dass alle Komponenten in der Datenquelle vergleichbar sind. Vergleichsausdrücke werden häufig in Where Klauseln zum Einschränken der Abfrageergebnisse verwendet.

Das folgende Beispiel in der Abfrageausdruckssyntax zeigt eine Abfrage, die Ergebnisse zurückgibt, bei denen die Auftragsnummer gleich "SO43663" ist:

string salesOrderNumber = "SO43663";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    IQueryable<SalesOrderHeader> salesInfo =
        from s in context.SalesOrderHeaders
        where s.SalesOrderNumber == salesOrderNumber
        select s;

    Console.WriteLine("Sales info-");
    foreach (SalesOrderHeader sale in salesInfo)
    {
        Console.WriteLine("Sales ID: " + sale.SalesOrderID);
        Console.WriteLine("Ship date: " + sale.ShipDate);
    }
}
Dim salesOrderNumber = "SO43663"
Using context As New AdventureWorksEntities()
    Dim salesInfo = _
        From s In context.SalesOrderHeaders _
        Where s.SalesOrderNumber = salesOrderNumber _
        Select s

    Console.WriteLine("Sales info-")
    For Each sale As SalesOrderHeader In salesInfo
        Console.WriteLine("Sales ID: " & sale.SalesOrderID)
        Console.WriteLine("Ship date: " & sale.ShipDate)
    Next
End Using

Das folgende Beispiel in der methodenbasierten Abfragesyntax zeigt eine Abfrage, die Ergebnisse zurückgibt, bei denen die Auftragsnummer gleich "SO43663" ist:

    string salesOrderNumber = "SO43663";
    IQueryable<SalesOrderHeader> salesInfo =
        context.SalesOrderHeaders
        .Where(s => s.SalesOrderNumber == salesOrderNumber)
        .Select(s => s);

    Console.WriteLine("Sales info-");
    foreach (SalesOrderHeader sale in salesInfo)
    {
        Console.WriteLine("Sales ID: " + sale.SalesOrderID);
        Console.WriteLine("Ship date: " + sale.ShipDate);
    }
}
Dim salesOrderNumber = "SO43663"
Using context As New AdventureWorksEntities()
    Dim salesInfo = _
        context.SalesOrderHeaders _
            .Where(Function(s) s.SalesOrderNumber = salesOrderNumber) _
            .Select(Function(s) s)

    Console.WriteLine("Sales info-")
    For Each sale As SalesOrderHeader In salesInfo
        Console.WriteLine("Sales ID: " & sale.SalesOrderID)
        Console.WriteLine("Ship date: " & sale.ShipDate)
    Next
End Using

Das folgende Beispiel in der Abfrageausdruckssyntax zeigt eine Abfrage, die Verkaufsauftragsinformationen zurückgibt, bei denen das Lieferdatum dem 8. Juli 2001 entspricht:

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    DateTime dt = new DateTime(2001, 7, 8);

    IQueryable<SalesOrderHeader> salesInfo =
        from s in context.SalesOrderHeaders
        where s.ShipDate == dt
        select s;

    Console.WriteLine("Orders shipped on August 7, 2001:");
    foreach (SalesOrderHeader sale in salesInfo)
    {
        Console.WriteLine("Sales ID: " + sale.SalesOrderID);
        Console.WriteLine("Total due: " + sale.TotalDue);
        Console.WriteLine();
    }
}
Using context As New AdventureWorksEntities()
    Dim dt As DateTime = New DateTime(2001, 7, 8)
    Dim salesInfo = _
        From s In context.SalesOrderHeaders _
        Where s.ShipDate = dt _
        Select s

    Console.WriteLine("Orders shipped on August 7, 2001:")
    For Each sale As SalesOrderHeader In salesInfo
        Console.WriteLine("Sales ID: " & sale.SalesOrderID)
        Console.WriteLine("Total due: " & sale.TotalDue)
        Console.WriteLine()
    Next
End Using

Das folgende Beispiel in methodenbasierter Abfragesyntax zeigt eine Abfrage, die Verkaufsauftragsinformationen zurückgibt, bei denen das Lieferdatum dem 8. Juli 2001 entspricht:

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    DateTime dt = new DateTime(2001, 7, 8);

    IQueryable<SalesOrderHeader> salesInfo =
        context.SalesOrderHeaders
        .Where(s => s.ShipDate == dt)
        .Select(s => s);

    Console.WriteLine("Orders shipped on August 7, 2001:");
    foreach (SalesOrderHeader sale in salesInfo)
    {
        Console.WriteLine("Sales ID: " + sale.SalesOrderID);
        Console.WriteLine("Total due: " + sale.TotalDue);
        Console.WriteLine();
    }
}
Using context As New AdventureWorksEntities()
    Dim dt As DateTime = New DateTime(2001, 7, 8)

    Dim salesInfo = _
        context.SalesOrderHeaders _
        .Where(Function(s) s.ShipDate = dt) _
        .Select(Function(s) s)

    Console.WriteLine("Orders shipped on August 7, 2001:")
    For Each sale As SalesOrderHeader In salesInfo
        Console.WriteLine("Sales ID: " & sale.SalesOrderID)
        Console.WriteLine("Total due: " & sale.TotalDue)
        Console.WriteLine()
    Next
End Using

Ausdrücke, die eine Konstante liefern, werden auf dem Server konvertiert, und es wird keine lokale Auswertung durchgeführt. Im folgenden Beispiel wird ein Ausdruck in der Where-Klausel verwendet, der eine Konstante zurückgibt.

Decimal totalDue = 200 + 3;
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    IQueryable<string> salesInfo =
        from s in context.SalesOrderHeaders
        where s.TotalDue >= totalDue
        select s.SalesOrderNumber;

    Console.WriteLine("Sales order numbers:");
    foreach (string orderNum in salesInfo)
    {
        Console.WriteLine(orderNum);
    }
}
Dim totalDue = 200 + 3
Using context As New AdventureWorksEntities()
    Dim salesInfo = _
        From s In context.SalesOrderHeaders _
        Where s.TotalDue >= totalDue _
        Select s.SalesOrderNumber

    Console.WriteLine("Sales order numbers:")
    For Each orderNum As String In salesInfo
        Console.WriteLine(orderNum)
    Next
End Using

LINQ to Entities unterstützt nicht die Verwendung einer Benutzerklasse als Konstante. Ein Eigenschaftsverweis für eine Benutzerklasse wird jedoch als Konstante betrachtet und in einen Konstantenausdruck der Befehlsstruktur konvertiert und für die Datenquelle ausgeführt.

class AClass { public int ID;}
Class AClass
    Public ID As Integer
End Class
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    AClass aClass = new AClass();
    aClass.ID = 43663;

    IQueryable<SalesOrderHeader> salesInfo =
        from s in context.SalesOrderHeaders
        where s.SalesOrderID == aClass.ID
        select s;

    Console.WriteLine("Order info-");
    foreach (SalesOrderHeader sale in salesInfo)
    {
        Console.WriteLine("Sales order number: " + sale.SalesOrderNumber);
        Console.WriteLine("Total due: " + sale.TotalDue);
        Console.WriteLine();
    }
}
Using context As New AdventureWorksEntities()
    Dim aClass As AClass = New aClass()
    aClass.ID = 43663

    Dim salesInfo = _
        From s In context.SalesOrderHeaders _
        Where s.SalesOrderID = aClass.ID _
        Select s

    Console.WriteLine("Order info-")
    For Each sale As SalesOrderHeader In salesInfo
        Console.WriteLine("Sales order number: " & sale.SalesOrderNumber)
        Console.WriteLine("Total due: " & sale.TotalDue)
        Console.WriteLine()
    Next
End Using

Methoden, die einen Konstantenausdruck zurückgeben, werden nicht unterstützt. Das folgende Beispiel enthält eine Methode in der Where Klausel, die eine Konstante zurückgibt. In diesem Beispiel wird zur Laufzeit eine Ausnahme ausgelöst.

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    MyClass2 myClass = new MyClass2();

    //Throws a NotSupportedException
    IQueryable<SalesOrderHeader> salesInfo =
        from s in context.SalesOrderHeaders
        where s.SalesOrderID == myClass.returnInt()
        select s;

    Console.WriteLine("Order info-");
    try
    {
        foreach (SalesOrderHeader sale in salesInfo)
        {
            Console.WriteLine("Sales order number: " + sale.SalesOrderNumber);
            Console.WriteLine("Total due: " + sale.TotalDue);
            Console.WriteLine();
        }
    }
    catch (NotSupportedException ex)
    {
        Console.WriteLine($"Exception: {ex.Message}");
    }
}
Using context As New AdventureWorksEntities()
    Dim aClass2 As AClass2 = New aClass2()

    ' Throws a NotSupportedException.
    Dim salesInfo = _
        From s In context.SalesOrderHeaders _
        Where s.SalesOrderID = aClass2.returnInt() _
        Select s

    Console.WriteLine("Order info-")
    Try
        For Each sale As SalesOrderHeader In salesInfo
            Console.WriteLine("Sales order number: " & sale.SalesOrderNumber)
            Console.WriteLine("Total due: " & sale.TotalDue)
            Console.WriteLine()
        Next
    Catch ex As NotSupportedException
        Console.WriteLine("Exception: {0}", ex.Message)
    End Try
End Using

Siehe auch