Procédure : filtrer les données (Entity Framework)
Cette rubrique montre comment filtrer des résultats de requête. L'exemple retourne une collection d'objets SalesOrderHeader qui représente toutes les commandes en ligne d'une valeur supérieure à 2 500 $. Le même exemple est repris en utilisant les technologies de requête Entity Framework suivantes :
LINQ to Entities
Entity SQL avec ObjectQuery<T>
Méthodes du Générateur de requêtes d'ObjectQuery<T>
Les exemples de cette rubrique sont basés sur le modèle de vente Adventure Works Sales Model. Pour exécuter le code de cet exemple, vous devez déjà avoir ajouté le modèle de vente AdventureWorks Sales Model à votre projet et configuré ce dernier pour qu'il utilise Entity Framework. Pour ce faire, exécutez les procédures décrites dans Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement un modèle EDM (Entity Data Model) (Entity Framework). Vous pouvez également définir le modèle de vente AdventureWorks Sales Model à l'aide de l'Assistant EDM. Pour plus d'informations, voir Procédure : utiliser l'Assistant Entity Data Model (Entity Framework).
Exemple
L'exemple ci-dessous utilise LINQ to Entities.
Using context As AdventureWorksEntities = _
New AdventureWorksEntities()
' Specify the order amount.
Dim orderCost As Integer = 2500
Try
' Define a LINQ query that returns only online orders
' more than the specified amount.
Dim onlineOrders = _
From order As SalesOrderHeader In context.SalesOrderHeader() _
Where order.OnlineOrderFlag = True And _
order.TotalDue > orderCost _
Select order
' Print order information.
For Each onlineOrder In onlineOrders
Console.WriteLine("Order ID:{0}Order date: " _
+ "{1}:d Order number: {2}", _
onlineOrder.SalesOrderID, _
onlineOrder.OrderDate, _
onlineOrder.SalesOrderNumber)
Next
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Specify the order amount.
int orderCost = 2500;
try
{
// Define a LINQ query that returns only online orders
// more than the specified amount.
var onlineOrders =
from order in context.SalesOrderHeader
where order.OnlineOrderFlag == true &&
order.TotalDue > orderCost
select order;
// Print order information.
foreach (var onlineOrder in onlineOrders)
{
Console.WriteLine("Order ID: {0} Order date: "
+ "{1:d} Order number: {2}",
onlineOrder.SalesOrderID,
onlineOrder.OrderDate,
onlineOrder.SalesOrderNumber);
}
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}
L'exemple ci-dessous utilise Entité SQL.
Using context As AdventureWorksEntities = _
New AdventureWorksEntities()
' Specify the order amount.
Dim orderCost As Integer = 2500
' Specify the Entity SQL query that returns only online orders
' more than the specified amount.
Dim queryString As String = "SELECT VALUE o FROM SalesOrderHeader AS o " _
+ "WHERE o.OnlineOrderFlag = TRUE AND o.TotalDue > @ordercost"
Try
' Define an ObjectQuery and pass the maxOrderCost parameter.
Dim onlineOrders As ObjectQuery(Of SalesOrderHeader) = _
New ObjectQuery(Of SalesOrderHeader)(queryString, context)
onlineOrders.Parameters.Add( _
New ObjectParameter("ordercost", orderCost))
' Print order information.
For Each onlineOrder In onlineOrders
Console.WriteLine("Order ID:{0}Order date: " _
+ "{1}:d Order number: {2}", _
onlineOrder.SalesOrderID, _
onlineOrder.OrderDate, _
onlineOrder.SalesOrderNumber)
Next
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Specify the order amount.
decimal orderCost = 2500;
// Specify the Entity SQL query that returns only online orders
// more than the specified amount.
string queryString = @"SELECT VALUE o FROM SalesOrderHeader AS o
WHERE o.OnlineOrderFlag = TRUE AND o.TotalDue > @ordercost";
try
{
// Define an ObjectQuery and pass the maxOrderCost parameter.
ObjectQuery<SalesOrderHeader> onlineOrders =
new ObjectQuery<SalesOrderHeader>(queryString, context);
onlineOrders.Parameters.Add(
new ObjectParameter("ordercost", orderCost));
// Print order information.
foreach (var onlineOrder in onlineOrders)
{
Console.WriteLine("Order ID: {0} Order date: "
+ "{1:d} Order number: {2}",
onlineOrder.SalesOrderID,
onlineOrder.OrderDate,
onlineOrder.SalesOrderNumber);
}
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}
L'exemple ci-dessous utilise la méthode du Générateur de requêtes.
Using context As AdventureWorksEntities = _
New AdventureWorksEntities()
' Specify the order amount.
Dim orderCost As Integer = 2500
Try
' Define an ObjectQuery that returns only online orders
' more than the specified amount.
Dim onlineOrders As ObjectQuery(Of SalesOrderHeader) = _
context.SalesOrderHeader.Where("it.OnlineOrderFlag = TRUE") _
.Where("it.TotalDue > @ordercost", _
New ObjectParameter("ordercost", orderCost))
' Print order information.
For Each onlineOrder In onlineOrders
Console.WriteLine("Order ID:{0}Order date: " _
+ "{1}:d Order number: {2}", _
onlineOrder.SalesOrderID, _
onlineOrder.OrderDate, _
onlineOrder.SalesOrderNumber)
Next
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Specify the order amount.
int orderCost = 2500;
try
{
// Define an ObjectQuery that returns only online orders
// more than the specified amount.
ObjectQuery<SalesOrderHeader> onlineOrders =
context.SalesOrderHeader
.Where("it.OnlineOrderFlag = TRUE AND it.TotalDue > @ordercost",
new ObjectParameter("ordercost", orderCost));
// Print order information.
foreach (var onlineOrder in onlineOrders)
{
var items = (from item in context.SalesOrderDetail
where item.SalesOrderHeader == onlineOrder
select item).Take(3);
Console.WriteLine("Order ID: {0} Order date: "
+ "{1:d} Order number: {2}",
onlineOrder.SalesOrderID,
onlineOrder.OrderDate,
onlineOrder.SalesOrderNumber);
}
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}