Выражения сравнения
Выражение сравнения проверяет, является ли значение константы, свойства или результата метода равным другому значению, не равным ему, большим или меньшим его. Если данное сравнение недопустимо в языке LINQ to Entities, будет выдано исключение. Все сравнения (явные и неявные) требуют сравнимости всех компонентов в источнике данных. Выражения сравнения часто используются в предложениях Where для ограничения результатов запроса.
Следующий пример с синтаксисом выражений запроса представляет собой запрос, возвращающий данные заказа, номер которого равен SO43663.
Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
Where s.SalesOrderNumber = "SO43663" _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
where s.SalesOrderNumber == "SO43663"
select s;
Console.WriteLine("Sales info-");
foreach (SalesOrderHeader sale in salesInfo)
{
Console.WriteLine("Sales ID: " + sale.SalesOrderID);
Console.WriteLine("Ship date: " + sale.ShipDate);
}
}
Следующий пример с синтаксисом запроса на основе методов представляет собой запрос, возвращающий данные заказа с номером SO43663.
Using AWEntities As New AdventureWorksEntities()
Dim salesInfo = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.SalesOrderNumber = "SO43663") _
.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
IQueryable<SalesOrderHeader> salesInfo =
AWEntities.SalesOrderHeader
.Where(s => s.SalesOrderNumber == "SO43663")
.Select(s => s);
Console.WriteLine("Sales info-");
foreach (SalesOrderHeader sale in salesInfo)
{
Console.WriteLine("Sales ID: " + sale.SalesOrderID);
Console.WriteLine("Ship date: " + sale.ShipDate);
}
}
Следующий пример с синтаксисом выражений запроса представляет собой запрос, возвращающий данные заказов, отправленных 8 июля 2001 года.
Using AWEntities As New AdventureWorksEntities()
Dim dt As DateTime = New DateTime(2001, 7, 8)
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
DateTime dt = new DateTime(2001, 7, 8);
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
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();
}
}
Следующий пример с синтаксисом запроса на основе методов представляет собой запрос, возвращающий данные заказов, отправленных 8 июля 2001 года.
Using AWEntities As New AdventureWorksEntities()
Dim dt As DateTime = New DateTime(2001, 7, 8)
Dim salesInfo = _
AWEntities.SalesOrderHeader _
.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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
DateTime dt = new DateTime(2001, 7, 8);
IQueryable<SalesOrderHeader> salesInfo =
AWEntities.SalesOrderHeader
.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();
}
}
Выражения, результатом которых является константа, преобразуются на сервере. Попытка вычислить их локально не производится. В следующем примере в предложении Where указано выражение, возвращающее константу.
Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 + 3 _
Select s.SalesOrderNumber
Console.WriteLine("Sales order numbers:")
For Each orderNum As String In salesInfo
Console.WriteLine(orderNum)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<string> salesInfo =
from s in sales
where s.TotalDue >= 200 + 3
select s.SalesOrderNumber;
Console.WriteLine("Sales order numbers:");
foreach (string orderNum in salesInfo)
{
Console.WriteLine(orderNum);
}
}
Технология LINQ to Entities не поддерживает использование пользовательского класса в качестве константы. Однако ссылка на свойство в пользовательском классе рассматривается как константа. Она будет преобразована в константное выражение дерева команд и выполнена в источнике данных.
Class AClass
Public ID As Integer
End Class
class AClass { public int ID;}
Using AWEntities As New AdventureWorksEntities()
Dim aClass As AClass = New aClass()
aClass.ID = 43663
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
AClass aClass = new AClass();
aClass.ID = 43663;
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
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();
}
}
Методы, возвращающие постоянное выражение, не поддерживаются. В следующем примере в предложении Where используется метод, возвращающий константу. Во время выполнения этого примера будет выдано исключение.
Using AWEntities As New AdventureWorksEntities()
Dim aClass2 As AClass2 = New aClass2()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
' Throws a NotSupportedException.
Dim salesInfo = _
From s In sales _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
MyClass2 myClass = new MyClass2();
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
//Throws a NotSupportedException
IQueryable<SalesOrderHeader> salesInfo =
from s in sales
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);
}
}