2010-11-05 5 views
1

Je reçois cette erreurLINQ to SQL ne peut pas convertir Int32 en String - comment cela est-il possible?

Unable to cast object of type 'System.Int32' to type 'System.String'. 

lorsque vous faites une routine pour LINQ requête SQL:

Return (
     From n In DbContext.Newsletters 
     Where n.NewsletterID = NewsletterID 
    ).FirstOrDefault 

est ici la trace de la pile FWIW.

[InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.] 
    System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +1151 
    System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +113 
    System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +344 
    System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute(Expression expression) +56 
    System.Linq.Queryable.FirstOrDefault(IQueryable`1 source) +265 
    ... 

Deux questions:

  1. Comment est-il possible qu'un Int32 ne peut pas être jeté à cordes?
  2. Comment puis-je déboguer quelque chose? Comme tout cela se passe profondément dans les entrailles de LINQ, je ne peux même pas savoir dans quel domaine cela est en colère.

Répondre

3

Votre mappage d'entité est peut-être incorrectement mappage d'un int à une chaîne quelque part? Vérifiez la cartographie pour chaque propriété de Newsletters.

+0

Oui - merci, cela semble l'avoir été. –

0

un des 2: soit

Return ( 
    From n In DbContext.Newsletters 
    Where n.NewsletterID = NewsletterID.ToString() 
).FirstOrDefault 

ou

Return ( 
    From n In DbContext.Newsletters 
    Where n.NewsletterID.ToString() = NewsletterID 
).FirstOrDefault 

BC sont les types mostlikely différents

+0

Non, n.NewsletterID et NewsletterID sont des entiers. Je reçois l'erreur dans le débogueur juste en demandant de voir DbContext.Newsletters. –

0

Eh bien, vous ne pouvez pas lancer un int à une chaîne parce que les types sont incompatibles, mais vous pouvez le convertir. Je pense qu'il est aussi simple que:

Return ( 
     From n In DbContext.Newsletters 
     Where n.NewsletterID = int.Parse(NewsletterID) 
    ).FirstOrDefault 

Parce que la variable locale est une chaîne et la colonne de base de données est un entier.

+0

Non, n.NewsletterID et NewsletterID sont tous les deux des entiers. Je reçois l'erreur dans le débogueur juste en demandant de voir DbContext.Newsletters. –

+0

@Herb - Vous avez peut-être une erreur dans vos mappages LINQ? Avez-vous par hasard changé le type d'une colonne après l'avoir ajoutée en utilisant le concepteur sans mettre à jour la compréhension du concepteur de celui-ci? – tvanfosson

0

Int32 ne peut pas être converti en String car ils ne sont pas du tout du même type. Vous pouvez convertir un Int32 en String via ToString, mais aucun cast n'est disponible.

De cette simple déclaration, je devrais deviner que n.NewsletterID et NewsletterID ne sont pas du même type. Un doit être converti en un Int32 ou un String, par ex.

Return (
     From n In DbContext.Newsletters 
     Where n.NewsletterID = NewsletterID.ToString(CultureInfo.InvariantCulture) 
    ).FirstOrDefault 

ou, plus probablement

Return (
     From n In DbContext.Newsletters 
     Where n.NewsletterID = Integer.Parse(NewsletterID, CultureInfo.InvariantCulture) 
    ).FirstOrDefault 

selon le type est sur chaque côté de l'expression.

+0

Non, n.NewsletterID et NewsletterID sont des entiers. Je reçois l'erreur dans le débogueur juste en demandant de voir DbContext.Newsletters. –