代码之家  ›  专栏  ›  技术社区  ›  Herb Caudill

LINQ to SQL不能将Int32强制转换为字符串-这怎么可能?

  •  1
  • Herb Caudill  · 技术社区  · 14 年前

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

    执行从LINQ到SQL的例行查询时:

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

    [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
       ...
    

    两个问题:

    1. 如何可能无法将Int32强制转换为字符串?
    2. 我怎么能调试这个?因为这一切都发生在林肯的内心深处,我甚至不能得到任何迹象表明这是什么领域的愤怒。
    4 回复  |  直到 14 年前
        1
  •  4
  •   Will    14 年前

    可能是实体映射错误地将int映射到某个字符串?检查通讯的每个属性的映射。

        2
  •  0
  •   dexter    14 年前

    任何一个

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

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

    这些是最不同的类型

        3
  •  0
  •   tvanfosson    14 年前

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

    因为局部变量是字符串,而数据库列是整数。

        4
  •  0
  •   bdukes Jon Skeet    14 年前

    Int32 不能被抛到 String 因为他们根本不是同一类型。你可以转换 国际32 给一个 通过 ToString ,但没有可用的演员。

    从这个简单的陈述,我不得不猜测 n.NewsletterID NewsletterID 不是同一类型。需要转换为 或者 字符串 ,例如。

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

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

    这取决于表达式两边的类型。