Как упорядочить объединение двух запросов (платформа Entity Framework)
В этом разделе показывается, как можно объединить результаты двух запросов в единый результирующий набор, а затем упорядочить результирующий набор. Один и тот же пример приводится с использованием всех следующих технологий запросов платформы Entity Framework .
Entity SQL с ObjectQuery<T>
Методы построителя запросов ObjectQuery<T>
Методы построителя запросов ObjectQuery<T>
Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код, используемый в данном разделе, нужно сначала добавить к проекту модель Adventure Works Sales и настроить его для использования платформы Entity Framework. Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (Entity Framework) или Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (Entity Framework).
Пример
Далее приведен пример Entity SQL . Чтобы объединить и упорядочить Entity SQL -запросы, необходимо использовать вложенность. В Entity SQL вложенные запросы должны быть заключены в скобки.
Using context As New AdventureWorksEntities()
Dim esqlQuery As String = "SELECT P2.Name, P2.ListPrice FROM ((SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice " & _
" FROM AdventureWorksEntities.Products as P1 where P1.Name like 'A%') union all" & _
" (SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice FROM AdventureWorksEntities.Products as P1" & _
" WHERE P1.Name like 'B%')) as P2 ORDER BY P2.Name"
For Each rec As DbDataRecord In New ObjectQuery(Of DbDataRecord)(esqlQuery, context)
Console.WriteLine("Name: {0}; ListPrice: {1}", rec(0), rec(1))
Next
End Using
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
String esqlQuery = @"SELECT P2.Name, P2.ListPrice
FROM ((SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice
FROM AdventureWorksEntities.Products as P1
where P1.Name like 'A%')
union all
(SELECT P1.Name, P1.ProductID as Pid, P1.ListPrice
FROM AdventureWorksEntities.Products as P1
WHERE P1.Name like 'B%')
) as P2
ORDER BY P2.Name";
foreach (DbDataRecord rec in
new ObjectQuery<DbDataRecord>(esqlQuery, context))
{
Console.WriteLine("Name: {0}; ListPrice: {1}", rec[0], rec[1]);
}
}
Это пример метода построителя запросов.
Using context As New AdventureWorksEntities()
Dim query As ObjectQuery(Of DbDataRecord) = _
context.Products.Select("it.Name, it.ProductID As Pid, it.ListPrice") _
.Where("it.Name LIKE 'A%'").Union(context.Products.Select("it.Name, it.ProductID As Pid, it.ListPrice") _
.Where("it.Name LIKE 'B%'")).Select("it.Name, it.ListPrice").OrderBy("it.Name")
For Each rec As DbDataRecord In query
Console.WriteLine("Name: {0}; ListPrice: {1}", rec(0), rec(1))
Next
End Using
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
ObjectQuery<DbDataRecord> query =
context.Products.Select("it.Name, it.ProductID As Pid, it.ListPrice")
.Where("it.Name LIKE 'A%'").Union(context.Products
.Select("it.Name, it.ProductID As Pid, it.ListPrice")
.Where("it.Name LIKE 'B%'")).Select("it.Name, it.ListPrice").OrderBy("it.Name");
foreach (DbDataRecord rec in query)
{
Console.WriteLine("Name: {0}; ListPrice: {1}", rec[0], rec[1]);
}
}
В следующем примере показано, как упорядочить объединение двух запросов с помощью LINQ to Entities.
Using context As New AdventureWorksEntities()
Dim query = (From a In context.Products Where a.Name.StartsWith("A") _
Select (New With {a.Name, .pid = a.ProductID, a.ListPrice})). _
Union( _
From b In context.Products Where b.Name.StartsWith("B") _
Select (New With {b.Name, .pid = b.ProductID, b.ListPrice})). _
Select(Function(c) New With {c.Name, c.ListPrice}).OrderBy(Function(d) d.Name)
For Each result In query
Console.WriteLine(result.Name)
Next
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var query = (from a in context.Products
where a.Name.StartsWith("A")
select new { a.Name, pid = a.ProductID, a.ListPrice })
.Union
(from b in context.Products
where b.Name.StartsWith("B")
select new { b.Name, pid = b.ProductID, b.ListPrice })
.Select(c => new { c.Name, c.ListPrice }).OrderBy(d => d.Name);
foreach (var result in query)
{
Console.WriteLine(result.Name);
}
}
См. также
Основные понятия
Выполнение запроса к концептуальной модели (платформа Entity Framework)