Comparações nulasNull Comparisons

Um valor null na fonte de dados indica que o valor é desconhecido.A null value in the data source indicates that the value is unknown. Em consultas LINQ to Entities, você pode verificar se há valores nulos para que determinados cálculos ou comparações sejam executados somente em linhas que tenham dados válidos, ou não nulos.In LINQ to Entities queries, you can check for null values so that certain calculations or comparisons are only performed on rows that have valid, or non-null, data. A semântica nula do CLR, no entanto, pode diferir da semântica nula da fonte de dados.CLR null semantics, however, may differ from the null semantics of the data source. A maioria dos bancos de dados usa uma versão da lógica de três valores para manipular comparações nulas.Most databases use a version of three-valued logic to handle null comparisons. Ou seja, uma comparação com um valor nulo não é avaliada como true ou false , ela é avaliada como unknown .That is, a comparison against a null value does not evaluate to true or false, it evaluates to unknown. Geralmente, essa é uma implementação de valores nulos ANSI, mas isso nem sempre acontece.Often this is an implementation of ANSI nulls, but this is not always the case.

Por padrão, no SQL Server, a comparação nulo igual a nulo retorna um valor nulo.By default in SQL Server, the null-equals-null comparison returns a null value. No exemplo a seguir, as linhas em que ShipDate is NULL são excluídas do conjunto de resultados e a instrução Transact-SQL retornaria 0 linhas.In the following example, the rows where ShipDate is null are excluded from the result set, and the Transact-SQL statement would return 0 rows.

-- Find order details and orders with no ship date.  
SELECT h.SalesOrderID  
FROM Sales.SalesOrderHeader h  
JOIN Sales.SalesOrderDetail o ON o.SalesOrderID = h.SalesOrderID  
WHERE h.ShipDate IS Null  

Isso é muito diferente de semântica nula do CLR, em que a comparação de null igual a null retorna true.This is very different from the CLR null semantics, where the null-equals-null comparison returns true.

A seguinte consulta LINQ é expressa no CLR, mas é executada na fonte de dados.The following LINQ query is expressed in the CLR, but it is executed in the data source. Como não há nenhuma garantia de que a semântica do CLR será respeitada na fonte de dados, o comportamento esperado será indeterminado.Because there is no guarantee that CLR semantics will be honored at the data source, the expected behavior is indeterminate.

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
    ObjectSet<SalesOrderDetail> details = context.SalesOrderDetails;

    var query =
        from order in orders
        join detail in details
        on order.SalesOrderID
        equals detail.SalesOrderID
        where order.ShipDate == null
        select order.SalesOrderID;

    foreach (var OrderID in query)
    {
        Console.WriteLine("OrderID : {0}", OrderID);
    }
}
Using context As New AdventureWorksEntities()

    Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
    Dim details As ObjectSet(Of SalesOrderDetail) = context.SalesOrderDetails

    Dim query = _
        From order In orders _
        Join detail In details _
        On order.SalesOrderID _
        Equals detail.SalesOrderID _
        Where order.ShipDate = Nothing
        Select order.SalesOrderID


    For Each orderID In query
        Console.WriteLine("OrderID: {0} ", orderID)
    Next
End Using

Seletores de chaveKey Selectors

Um seletor de chave é uma função usada nos operadores de consulta padrão para extrair uma chave de um elemento.A key selector is a function used in the standard query operators to extract a key from an element. Na função do seletor de chave, uma expressão pode ser comparada a uma constante.In the key selector function, an expression can be compared with a constant. A semântica nula do CLR será exibida se uma expressão for comparada com uma constante nula ou se duas constantes nulas forem comparadas.CLR null semantics are exhibited if an expression is compared to a null constant or if two null constants are compared. As semânticas nulas de armazenamento serão exibidas se duas colunas com valores nulos na fonte de dados forem comparadas.Store null semantics are exhibited if two columns with null values in the data source are compared. Os seletores de chave são encontrados em muitos operadores de consulta padrão de agrupamento e ordenação, como GroupBy, e usados para selecionar as chaves que servirão de base para a ordenação ou o agrupamento do resultados da consulta.Key selectors are found in many of the grouping and ordering standard query operators, such as GroupBy, and are used to select keys by which to order or group the query results.

Propriedade nula em um objeto nuloNull Property on a Null Object

No Entity Framework, as propriedades de um objeto nulo são nulas.In the Entity Framework, the properties of a null object are null. Ao tentar fazer referência à propriedade de um objeto nulo no CLR, você receberá NullReferenceException.When you attempt to reference a property of a null object in the CLR, you will receive a NullReferenceException. Quando uma consulta LINQ envolver uma propriedade de um objeto nulo, o resultado possivelmente será um comportamento inconsistente.When a LINQ query involves a property of a null object, this can result in inconsistent behavior.

Por exemplo, na consulta a seguir, a conversão em NewProduct é feita na camada da árvore de comandos, que pode resultar na propriedade Introduced que está sendo nula.For example, in the following query, the cast to NewProduct is done in the command tree layer, which might result in the Introduced property being null. Se o banco de dados tiver definido comparações nulas, como a comparação DateTime que é avaliada como true, a linha será incluída.If the database defined null comparisons such that the DateTime comparison evaluates to true, the row will be included.

using (AdventureWorksEntities context = new AdventureWorksEntities())
{

    DateTime dt = new DateTime();
    var query = context.Products
        .Where(p => (p as NewProduct).Introduced > dt)
        .Select(x => x);
}
Using context As New AdventureWorksEntities()
    Dim dt As DateTime = New DateTime()
    Dim query = context.Products _
        .Where(Function(p) _
            ((DirectCast(p, NewProduct)).Introduced > dt)) _
        .Select(Function(x) x)
End Using

Passando coleções nulas para funções agregadasPassing Null Collections to Aggregate Functions

Em LINQ to Entities, quando você passa uma coleção que dá suporte IQueryable a uma função de agregação, as operações de agregação são executadas no banco de dados.In LINQ to Entities, when you pass a collection that supports IQueryable to an aggregate function, aggregate operations are performed at the database. Talvez haja diferenças nos resultados de uma consulta executada na memória e de uma consulta executada no banco de dados.There might be differences in the results of a query that was performed in-memory and a query that was performed at the database. Com uma consulta de memória, se não houver nenhuma correspondência, a consulta retornará zero.With an in-memory query, if there are no matches, the query returns zero. No banco de dados, a mesma consulta retorna null.At the database, the same query returns null. Se um null valor for passado para uma função de agregação LINQ, uma exceção será lançada.If a null value is passed to a LINQ aggregate function, an exception will be thrown. Para aceitar null os valores possíveis, converta os tipos e as propriedades dos tipos que recebem resultados da consulta para tipos de valor anuláveis.To accept possible null values, cast the types and the properties of the types that receive query results to nullable value types.

Consulte tambémSee also