Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un null valore nell'origine dati indica che il valore è sconosciuto. Nelle query LINQ to Entities è possibile verificare la presenza di valori Null in modo che determinati calcoli o confronti vengano eseguiti solo su righe con dati validi o non Null. La semantica CLR Null, tuttavia, può differire dalla semantica Null dell'origine dati. La maggior parte dei database usa una versione della logica a tre valori per gestire confronti null. Ovvero, un confronto con un valore Null non restituisce true o false, restituisce unknown. Spesso si tratta di un'implementazione di valori Null ANSI, ma questo non è sempre il caso.
Per impostazione predefinita in SQL Server, il confronto null-equals-null restituisce un valore Null. Nell'esempio seguente le righe in cui ShipDate è Null vengono escluse dal set di risultati e l'istruzione Transact-SQL restituirà 0 righe.
-- 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
Ciò è molto diverso dalla semantica CLR null, in cui il confronto null-equals-null restituisce true.
La query LINQ seguente è espressa in CLR, ma viene eseguita nell'origine dati. Poiché non esiste alcuna garanzia che la semantica CLR venga rispettata nell'origine dati, il comportamento previsto è indeterminato.
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 : {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
Selettori chiave
Un selettore di chiave è una funzione usata negli operatori di query standard per estrarre una chiave da un elemento. Nella funzione del selettore di tasti è possibile confrontare un'espressione con una costante. La semantica CLR Null viene mostrata se un'espressione viene confrontata con una costante Null o se vengono confrontate due costanti Null. Se vengono confrontate due colonne con valori Null nell'origine dati, vengono visualizzate semantiche Null dell'archivio. I selettori di chiave sono disponibili in molti degli operatori di query standard di raggruppamento e ordinamento, ad esempio GroupBy, e vengono usati per selezionare le chiavi in base alle quali ordinare o raggruppare i risultati della query.
proprietà nulla su un oggetto nullo
In Entity Framework le proprietà di un oggetto Null sono Null. Quando si tenta di fare riferimento a una proprietà di un oggetto Null in CLR, si riceverà un oggetto NullReferenceException. Quando una query LINQ comporta una proprietà di un oggetto Null, questo può comportare un comportamento incoerente.
Nella query seguente, ad esempio, il cast a NewProduct viene eseguito nel livello dell'albero dei comandi, il che potrebbe comportare il fatto che la proprietà Introduced sia nulla. Se il database ha definito confronti Null in modo che il DateTime confronto restituisca true, la riga verrà inclusa.
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
Passaggio di raccolte nulle alle funzioni di aggregazione
In LINQ to Entities, quando si passa una raccolta che supporta IQueryable a una funzione di aggregazione, le operazioni di aggregazione vengono eseguite nel database. Potrebbero esserci differenze nei risultati di una query eseguita in memoria e di una query eseguita nel database. Se non ci sono corrispondenze, un'interrogazione in memoria restituisce zero. Nel database la stessa query restituisce null. Se un null valore viene passato a una funzione di aggregazione LINQ, verrà generata un'eccezione. Per accettare possibili valori null, eseguire un cast dei tipi e delle proprietà dei tipi che ricevono i risultati della query a tipi di valore nullable.