Procedura: ordinare due query riunite (Entity Framework)
In questo argomento viene illustrato come combinare i risultati di due query in un singolo gruppo di risultati, quindi ordinare il gruppo di risultati. Lo stesso esempio viene illustrato utilizzando ognuna delle tecnologie di query Entity Framework seguenti:
Entity SQL con ObjectQuery<T>
Metodi del generatore di query di ObjectQuery<T>
Gli esempi inclusi in questo argomento sono basati sul modello descritto in Modello Sales di AdventureWorks (EDM). Per eseguire il codice incluso in questi esempi, è necessario avere già aggiunto il modello Sales di AdventureWorks al progetto e avere configurato il progetto per l'utilizzo di Entity Framework. A tale scopo, completare le procedure descritte in Procedura: configurare manualmente un progetto di Entity Framework e Procedura: definire manualmente un modello EDM (Entity Framework). È inoltre possibile utilizzare la procedura guidata Entity Data Model per definire il modello Sales di AdventureWorks. Per ulteriori informazioni, vedere Procedura: utilizzare la procedura guidata Entity Data Model (Entity Framework).
Esempio
Di seguito viene fornito un esempio di utilizzo di Entity SQL. Per riunire e ordinare le query Entity SQL, è necessario utilizzare la nidificazione. In Entity SQL le query nidificate devono essere racchiuse tra parentesi.
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());
}
}
Di seguito viene fornito un esempio del metodo del generatore di query.
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());
}
}
Vedere anche
Altre risorse
Esecuzione di query su Entity Data Model (attività di Entity Framework)