Procédure : classer deux requêtes unies (Entity Framework)
Cette rubrique montre comment combiner les résultats de deux requêtes dans un seul jeu de résultats, puis comment ordonner ce jeu de résultats. Le même exemple est repris en utilisant chacune des technologies de requête Entity Framework suivantes :
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 AdventureWorks Sales Model (EDM). Pour exécuter le code de ces exemples, vous devez déjà avoir ajouté le modèle de vente AdventureWorks à 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 Entité SQL. Pour unir et ordonner des requêtes Entité SQL, vous devez utiliser l'imbrication. Dans Entité SQL, les requêtes imbriquées doivent être placées entre parenthèses.
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());
}
}
Cet exemple utilise la méthode du Générateur de requêtes.
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());
}
}