Поделиться через


Выражения сравнения

Выражение сравнения проверяет, является ли значение константы, свойства или результата метода равным другому значению, не равным ему, большим или меньшим его. Если данное сравнение недопустимо в языке 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);
    }
}

См. также

Основные понятия

Выражения в запросах LINQ to Entities