Vergleichsausdrücke
Ein Vergleichsausdruck überprüft, ob ein konstanter Wert, ein Eigenschaftswert oder das Ergebnis einer Methode gleich oder ungleich einem anderen Wert bzw. 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. Für alle Vergleiche, sowohl implizite als auch explizite, ist es erforderlich, dass alle Komponenten in der Datenquelle vergleichbar sind. Vergleichsausdrücke werden häufig in Where-Klauseln zur Einschränkung der Abfrageergebnisse verwendet.
Im folgenden Beispiel von Abfrageausdruckssyntax wird eine Abfrage dargestellt, die Ergebnisse mit der Auftragsnummer "SO43663" zurückgibt:
Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
Where s.SalesOrderNumber = "SO43663" _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
where s.SalesOrderNumber == "SO43663"
select s;
Console.WriteLine("Sales info-");
foreach (SalesOrderHeader sale in salesInfo)
{
Console.WriteLine("Sales ID: " + sale.SalesOrderID);
Console.WriteLine("Ship date: " + sale.ShipDate);
}
}
Im folgenden Beispiel von methodenbasierter Abfragesyntax wird eine Abfrage dargestellt, die Ergebnisse mit der Auftragsnummer "SO43663" zurückgibt:
Using AWEntities As New AdventureWorksEntities()
Dim salesInfo = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.SalesOrderNumber = "SO43663") _
.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
IQueryable<SalesOrderHeader> salesInfo =
AWEntities.SalesOrderHeader
.Where(s => s.SalesOrderNumber == "SO43663")
.Select(s => s);
Console.WriteLine("Sales info-");
foreach (SalesOrderHeader sale in salesInfo)
{
Console.WriteLine("Sales ID: " + sale.SalesOrderID);
Console.WriteLine("Ship date: " + sale.ShipDate);
}
}
Im folgenden Beispiel von Abfrageausdruckssyntax wird eine Abfrage dargestellt, die Auftragsinformationen zu Aufträgen mit dem Lieferdatum 8. Juli 2001 zurückgibt:
Using AWEntities As New AdventureWorksEntities()
Dim dt As DateTime = New DateTime(2001, 7, 8)
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
DateTime dt = new DateTime(2001, 7, 8);
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
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();
}
}
Im folgenden Beispiel von methodenbasierter Abfragesyntax wird eine Abfrage dargestellt, die Auftragsinformationen zu Aufträgen mit dem Lieferdatum 8. Juli 2001 zurückgibt:
Using AWEntities As New AdventureWorksEntities()
Dim dt As DateTime = New DateTime(2001, 7, 8)
Dim salesInfo = _
AWEntities.SalesOrderHeader _
.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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
DateTime dt = new DateTime(2001, 7, 8);
IQueryable<SalesOrderHeader> salesInfo =
AWEntities.SalesOrderHeader
.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();
}
}
Ausdrücke, die einen konstanten Wert zurückgeben, 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.
Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 + 3 _
Select s.SalesOrderNumber
Console.WriteLine("Sales order numbers:")
For Each orderNum As String In salesInfo
Console.WriteLine(orderNum)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<string> salesInfo =
from s in sales
where s.TotalDue >= 200 + 3
select s.SalesOrderNumber;
Console.WriteLine("Sales order numbers:");
foreach (string orderNum in salesInfo)
{
Console.WriteLine(orderNum);
}
}
LINQ-to-Entities unterstützt die Verwendung von Benutzerklassen als Konstanten nicht. Ein Eigenschaftsverweis in einer Benutzerklasse wird jedoch als konstant behandelt. Er wird in einen konstanten Ausdruck der Befehlsstruktur konvertiert und in der Datenquelle ausgeführt.
Class AClass
Public ID As Integer
End Class
class AClass { public int ID;}
Using AWEntities As New AdventureWorksEntities()
Dim aClass As AClass = New aClass()
aClass.ID = 43663
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
AClass aClass = new AClass();
aClass.ID = 43663;
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
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();
}
}
Methoden, die einen konstanten Ausdruck zurückgeben, werden nicht unterstützt. Das folgende Beispiel enthält eine Methode in der Where-Klausel, die eine Konstante zurückgibt. Dieses Beispiel löst zur Laufzeit eine Ausnahme aus.
Using AWEntities As New AdventureWorksEntities()
Dim aClass2 As AClass2 = New aClass2()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
' Throws a NotSupportedException.
Dim salesInfo = _
From s In sales _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
MyClass2 myClass = new MyClass2();
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
//Throws a NotSupportedException
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
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: {0}", ex.Message);
}
}