Venerdì scorso, il mio collega Luca stava litigando con un problema determinato da valori null, DbNull e Guid in una classe che si occupa di effettuare query su Database.
La classe Guid, è una classe di tipo Value Type, pertanto non è nullabile. Per contro, nelle Stored Procedure, io utilizzo il valore DbNull come indicatore di Default per indicare che un parametro di filtro è vuoto e deve quindi essere ignorato.
Modificare parecchie classi C# per trasformare il Guid in un Nullable Guid diveniva complicato e non facile da gestire e aggiornare, pertanto abbiamo provato a ragionare ed è risultato che se avessimo potuto usare un Guid.Empty nelle nostre stored procedure (o nelle query ad hoc), avremmo risolto il problema senza complicate manovre.
Facendo varie prove siamo stati in grado di produrre la seguente Scalar Function:
CREATE FUNCTION Guid_Empty() RETURNS UniqueIdentifier AS BEGIN RETURN cast(cast(0 as binary) as uniqueidentifier) END GO
Dopo aver generato la funzione qui sopra ed una semplice tabella nel mio famigerato database di test, sono stata in grado di scrivere la query seguente:
SELECT [ID] ,[Descrizione] ,[Prezzo] ,[Quantità] ,[Umi] ,IsNull(AltGuid, dbo.Guid_EMPTY()) AS Alt FROM [paperinik].[dbo].[TbRighe]
Che produce la seguente tabella risultante:
Posso inoltre usare la mia funzione per creare la query seguente:
SELECT [ID] ,[Descrizione] ,[Prezzo] ,[Quantità] ,[Umi] ,IsNull(AltGuid, dbo.Guid_EMPTY()) AS Alt FROM [paperinik].[dbo].[TbRighe] WHERE IsNull(AltGuid, dbo.Guid_EMPTY()) = dbo.Guid_EMPTY()
Che mi permette di filtrare le righe con Guid.Empty oppure posso usare l’operatore <> per cercare le sole righe con un Guid non vuoto. Usando questo tipo di Query, posso tranquillamente passare come parametro il Guid.Empty di C# come filtro senza la necessità di creare un Guid nullable o implementare complicate espressioni di controllo nelle mie classi.