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