2010-01-27 7 views
2

J'ai la requête suivante dans LINQ. "Symbol" n'existe pas, et la requête est nulle, mais j'ai eu une erreur, de casting et le programme se bloque.expression LINQ retour null

decimal x = from cie in m_entities.Cie 
      where cie.symbol.Equals(Symbol) 
      select cie.cie_id; 

Ou puis-je avoir une valeur nulle dans x?

+3

Quel est le message d'exception ** exact ** que vous obtenez? –

+1

En supposant que 'm_entities.Cie' est un IQueryable ou IEnumerable, comment ce programme compile-t-il pour produire une exception au moment de l'exécution, car le résultat de la requête devrait être IEnumerable et non un nombre décimal? – dtb

Répondre

5

Je ne pense pas que x sera jamais nul - vous obtiendrez juste un vide IQueryable<T> (ou est-ce IEnumrable<T>?), Où T est le type de données de cie_id.

L'erreur de conversion est due au fait que vous tentez de convertir la collection en decimal.

+0

Je ne vois aucun cast dans le code ... – dtb

+0

... donc vous pouvez envelopper la requête dans '(...)' et ensuite appeler '.FirstOrDefault()' pour retourner le résultat solitaire ou '0'. – Jay

+1

La distribution est implicite en ce que la requête renvoie une collection, mais 'x' est déclaré comme' decimal'. Si 'x' était déclaré avec' var', il n'y aurait pas de 'InvalidCastException', mais' x' ne serait pas 'decimal' non plus. – Jay

1

En supposant que cie_id est un nombre décimal, essayez ceci:

decimal x = (from cie in m_entities.Cie 
        where cie.symbol.Equals(Symbol) 
        select cie.cie_id).FirstOrDefault() 

Votre code actuel tente d'attribuer IEnumerable < décimal > à la décimale, qui ne fonctionnera pas. FirstOrDefault sélectionne la première correspondance, le cas échéant, sinon 0.

Si vous savez qu'il y aura des correspondances 1 ou 0, vous pouvez envisager SingleOrDefault au lieu de FirstOrDefault.