2010-04-26 4 views
1

Ceci est une erreur bizarre que je n'arrive pas à comprendre.Linq Erreur lors de la génération de SelectListItems

Ma méthode a un paramemer un nullable int

int? selectedtitleid

Voici le code Linq:

var titles = from t in dc.Titles 
      select new SelectListItem 
      { 
       Text = t.Title1, 
       Value = t.TitleID.ToString(), 
       Selected = (t.TitleID == selectedtitleid) 
      }; 

return titles.ToList(); // Error gets thrown here 

Il fonctionne très bien quand selectedtitleid est pas nul - mais renvoie une exception quand il est nul. L'exception est: La valeur null ne peut pas être affectée à un membre de type System.Boolean qui est un type de valeur non nullable.

J'ai fait un test qui était quelque chose comme ça

int? t1 = null; 
bool b1 = (t1 == null); 

Et b1 se prépare à faux - alors pourquoi ne pas se produire dans la requête Linq?

C'est probablement quelque chose de simple - donc quelqu'un a des idées?

Vive

Répondre

1

OK, la requête LINQ que vous avez fourni transféreront à SQL syntaxe comme:

SELECT 
    [t0].[Title1], 
    [t0].[TitleID], 
    (CASE 
     WHEN [t0].[TitleID] = @p1 THEN 1 
     WHEN NOT ([t0].[TitleID] = @p1) THEN 0 
     ELSE NULL 
    END) AS [Value] 
FROM [dbo].[Titles] AS [t0] 

@p1 est en fait votre variable selectedtitleid.

Maintenant, imaginez que selectedtitleid = null. Cela signifie que ni la première condition, ni la seconde dans le bloc CASE ne seront remplies. C'est parce que la valeur nulle dans SQL (null n'est pas égale à toute autre valeur même null). Ainsi, lorsque la valeur selectedtitleid est null, la valeur null pour le champ [Value] sera renvoyée. C'est pourquoi vous obtenez votre exception.

La solution est de changer votre code:

var titles = from t in dc.Titles 
      select new SelectListItem 
      { 
       Text = t.Title1, 
       Value = t.TitleID.ToString(), 
       Selected = ((t.TitleID ?? 0) == (selectedtitleid ?? 0)) 
      }; 

Cela signifie que insted de null il y aura des nombres entiers comparaison. Donc, si t.TitleID est null et selectedtitleid est null, Selected sera défini sur true.

+0

Ahhh bon homme - c'est parfait :) En fait, j'essayé de le faire (t.TitleID == selectedtitleid) ?? false - mais parce qu'il est en train de le changer en SQL cela n'a pas fonctionné :) Acclamations Alex – Eoinii

0

Je viens de rencontrer ce même problème lorsque la valeur sélectionnée était une chaîne, c'est l'exception car généralement, vous auriez une sorte d'int ou de GUID comme valeur sélectionnée. Ma solution de contournement consistait à ajouter une vérification pour string.IsNullOrEmpty.

var x = from cp in db.CompanyPrefix 
     orderby cp.CompanyPrefixName 
     select new SelectListItem 
        { 
         Text = cp.CompanyPrefixName, 
         Value = cp.CompanyPrefixName, 
         Selected = (uti != null && !string.IsNullOrEmpty(uti.CompanyPrefix) && uti.CompanyPrefix == cp.CompanyPrefixName) 
        }; 
Questions connexes