{"id":517,"date":"2011-10-15T14:18:08","date_gmt":"2011-10-15T13:18:08","guid":{"rendered":"http:\/\/www.aleprex.it\/wordpress\/?p=517"},"modified":"2011-10-15T14:19:15","modified_gmt":"2011-10-15T13:19:15","slug":"linq-to-sql-query-con-campi-a-null","status":"publish","type":"post","link":"https:\/\/www.aleprex.it\/wordpress\/linq-to-sql-query-con-campi-a-null.html","title":{"rendered":"Linq To Sql &#8211; query con campi a null"},"content":{"rendered":"<p>Lavorando su un progetto winform in vb.net e linq to sql mi sono imbattuto in un problema in cui ho perso un p\u00f2 di tempo per venirne a capo.<br \/>\nPraticamente il problema di fondo \u00e8 quello di scrivere una query linq che recuperi dei record filtrandoli su un campo che pu\u00f2 essere anche NULL (nell&#8217;esempio il campo che contiene anche valori a NULL \u00e8 il campo CF).<br \/>\nQuindi avere sia i record che soddisfano la condizione del parametro sia quelli che hanno il campo a NULL.<br \/>\nIn t-sql la query sarebbe scritta pi\u00f9 o meno in questa maniera:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\nSELECT * FROM Anagrafica\r\nWHERE NOME = @Nome\r\nAND((@cf IS NULL) OR (cf = @cf))\r\n\r\n<\/pre>\n<p><!--more--><\/p>\n<p>Con questo tipo di query sto semplicemente chiedendo di restituirmi tutti i record il cui campo Nome \u00e8 uguale al parametro @Nome e il codice fiscale \u00e8 uguale al parametro @cf <em>oppure <\/em>\u00e8 NULL.<\/p>\n<p>La stessa pu\u00f2 essere scritta anche con l&#8217;uso della funzione <a href=\"http:\/\/msdn.microsoft.com\/it-it\/library\/ms184325.aspx\" target=\"_blank\">ISNULL() <\/a><\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\nSELECT * FROM Anagrafica\r\nWHERE NOME = @Nome\r\nand (ISNULL(cf,'') = ISNULL(@cf, '') or CF = ISNULL(@cf,CF))\r\n\r\n<\/pre>\n<p>Ora per simulare lo stesso comportamento in una query Linq dobbiamo avvalerci di un piccolo workaround, o meglio, quello che non ho capito \u00e8 come poter simulare la funzione ISNULL() in Linq, su <a title=\"stackoverflow.com\" href=\"http:\/\/stackoverflow.com\/questions\/413084\/equivalent-of-sql-isnull-in-linq\" target=\"_blank\">stackoverflow <\/a>consigliano di usare i tipi nullable.<br \/>\nAndiamo a vedere come tutto questo si traduce in codice VB.NET<\/p>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n\r\nDim db As New testDataContext\r\nDim qy = From p In db.Test\r\n                Where p.Nome = If(ComboBox1.SelectedIndex = -1, p.Nome, CStr(ComboBox1.SelectedValue)) _\r\n                And (If(p.CF, &quot;&quot;) = (CStr(IIf(TextBox1.Text = &quot;&quot;, If(p.CF, &quot;&quot;), TextBox1.Text))))\r\n                Select p\r\n\r\n<\/pre>\n<p><a href=\"http:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull01.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-529 alignright\" style=\"margin: 5px;\" title=\"linqIsNull01\" src=\"http:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull01-300x186.jpg\" alt=\"\" width=\"300\" height=\"186\" srcset=\"https:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull01-300x186.jpg 300w, https:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull01.jpg 511w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nCome potete vedere nella <strong>And <\/strong>specifichiamo<strong> If(p.CF,&#8221;&#8221;) <\/strong> dove praticamente Linq lo traduce in t-sql usando la funzione <strong><a href=\"http:\/\/msdn.microsoft.com\/it-it\/library\/ms190349.aspx\" target=\"_blank\">COALESCE<\/a><\/strong> il che significa che dove il campo CF risulta NULL verr\u00e0 rimpiazzato con un carattere vuoto che per il motore database \u00e8 gestito diversamente dal valore NULL.<\/p>\n<p>La seconda cosa che andiamo a fare \u00e8 quella di controllare che il valore che mettiamo nella nostra casella di testo (per servircene come parametro) non sia vuoto, perch\u00e8 se cos\u00ec fosse dobbiamo fare in modo che il confronto venga effettuato con la stesso identico operatore di sinistra (ovvero come se facessimo AND 1=1).<br \/>\nPer farlo mi sono servito di una Iif(expr,TruePart,FalsePart).<\/p>\n<p>Se invece di voler utilizzare l&#8217;operatore di uguaglianza volessimo effettuare una Like sul parametro passato, allora la query link si semplifica ulteriormente eliminando un p\u00f2 di If:<\/p>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n\r\nDim qy = From p In db.Anagrafica\r\n                 Where p.Nome = If(ComboBox1.SelectedIndex = -1, p.Nome, CStr(ComboBox1.SelectedValue)) _\r\n                 And If(p.CF, &quot;&quot;).Contains(TextBox1.Text)\r\n                 Select p\r\n\r\n<\/pre>\n<p><a href=\"http:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull02.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-535\" style=\"margin: 5px;\" title=\"linqIsNull02\" src=\"http:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull02-300x217.jpg\" alt=\"\" width=\"300\" height=\"217\" srcset=\"https:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull02-300x217.jpg 300w, https:\/\/www.aleprex.it\/wordpress\/wp-content\/uploads\/2011\/10\/linqIsNull02.jpg 470w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Come potete vedere con la Like non c&#8217;\u00e8 bisogno di ricontrollare se la nostra textbox sia vuota o meno.<\/p>\n<p>Sinceramente non so se questo che ho utilizzato \u00e8 il metodo migliore e il pi\u00f9 pulito per poter recuperare anche i record a NULL, sinceramente in rete ho trovato molto poco, il che mi fa pensare che venga utilizzato sicuramente un altro approccio per fare la stessa cosa.<\/p>\n<p>Ovviamente agendo lato sql server le possibilit\u00e0 sarebbero molte, si pu\u00f2 creare una stored procedure e richiamarla da LINQ, oppure possiamo fare una vista della tabella che contiene i valore null e sostituirli con gli apici sfruttando la funzione ISNULL(CAMPO,&#8221;), oppure potremmo ancora mettere un default su campo in modo da non avere pi\u00f9 valori NULL (quest&#8217;ultima soluzione la trovo un p\u00f2 sporca soprattutto se nel db vengono utilizzate parecchie stored procedure che filtrano i valori a NULL con la sintassi standard <strong>Where Campo IS NULL<\/strong> in questa maniera ci sarebbe parecchio codice da andare a riscrivere \ud83d\ude42 )<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lavorando su un progetto winform in vb.net e linq to sql mi sono imbattuto in un problema in cui ho perso un p\u00f2 di tempo per venirne a capo. Praticamente il problema di fondo \u00e8 quello di scrivere una query linq che recuperi dei record filtrandoli su un campo che pu\u00f2 essere anche NULL (nell&#8217;esempio [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[29,28,27,3],"tags":[31,32,34,23],"class_list":["post-517","post","type-post","status-publish","format-standard","hentry","category-coding","category-develop","category-programmazione","category-sql","tag-linq","tag-linqtosql","tag-sql","tag-sql-server"],"_links":{"self":[{"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/posts\/517","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/comments?post=517"}],"version-history":[{"count":22,"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/posts\/517\/revisions"}],"predecessor-version":[{"id":541,"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/posts\/517\/revisions\/541"}],"wp:attachment":[{"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/media?parent=517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/categories?post=517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aleprex.it\/wordpress\/wp-json\/wp\/v2\/tags?post=517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}