Expressions de comparaison
Une expression de comparaison définit une valeur constante, une valeur de propriété ou un résultat de méthode par rapport à une autre valeur (égal, différent de, supérieur à ou inférieur à). Si une comparaison particulière n’est pas valide pour LINQ to Entities, une exception est levée. Toutes les comparaisons, implicites et explicites, requièrent que tous les composants soient comparables dans la source de données. Des expressions de comparaison sont souvent utilisées dans des clauses Where
pour restreindre les résultats d'une requête.
L'exemple suivant dans la syntaxe d'expression de requête présente une requête qui retourne des résultats dans lesquels le numéro de commande client est égal à SO43663 :
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
L'exemple suivant dans la syntaxe de requête fondée sur une méthode présente une requête qui retourne des résultats dans lesquels le numéro de commande client est égal à SO43663 :
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
L'exemple suivant dans la syntaxe d'expression de requête présente une requête qui retourne des informations de commande client dans lesquelles la date d'expédition est égale au 8 juillet 2001 :
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
L'exemple suivant dans la syntaxe de requête fondée sur une méthode présente une requête qui retourne des informations de commande client dans lesquelles la date d'expédition est égale au 8 juillet 2001 :
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
Les expressions qui génèrent une constante sont converties au niveau du serveur, et aucune tentative d'évaluation locale n'est effectuée. L'exemple suivant utilise une expression dans la clause Where
qui génère une constante.
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 ne prend pas en charge l’utilisation d’une classe d’utilisateur comme constante. Toutefois, une référence de propriété sur une classe d'utilisateur est considérée comme une constante. Elle est donc convertie en expression constante d'arborescence de commandes et exécutée sur la source de données.
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
Les méthodes qui retournent une expression constante ne sont pas prises en charge. L'exemple suivant contient une méthode dans la clause Where
qui retourne une constante. Cet exemple lève une exception au moment de l'exécution.
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: {0}", 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