title: NHibernate asks .NET to convert a string parameter to an integer, don't know why
body: <p>(Edited to avoid leading down the wrong road)</p>
  
  <p>Before giving details, very short version: I have a SQL statement I need to get out of NHibernate, and I have Criteria API statements that give it to me.  The NHibernate is trying to do something wrong with the statement it generates, and I'm trying to figure out why.</p>
  
  <p>I have the following mappings in Fluent NHibernate:</p>
  
  <pre><code>public class StaffClass {
      public virtual int Staff_DBID { get; private set; }
      public virtual int Class_DBID { get; private set; }
  
      // Equals and GetHasCode overrides not shown
      // other code originally here removed as it was distracting from the point and didn't change anything
  }
  
  public class StaffClassMap : ClassMap&lt;StaffClass&gt; {
      public StaffClassMap() {
          CompositeId()
              .KeyProperty(x =&gt; x.Staff_DBID)
              .KeyProperty(x =&gt; x.Class_DBID);
      }
  }
  </code></pre>
  
  <p>A similar set of code is present for a table named ClassStudent.  Both of these tables are join tables.</p>
  
  <p>I have the following code that runs against domain objects:</p>
  
  <pre><code>            using (transaction = session.BeginTransaction()) {
  
                  var criteria = session.CreateCriteria(typeof(Student));
  
                  var staffClasses = DetachedCriteria.For&lt;StaffClass&gt;()
                      .Add(Restrictions.Eq("Staff_DBID", desiredStaffDBID))
                      .SetProjection(Projections.Property("Class_DBID"));
  
                  var studentClasses = DetachedCriteria.For&lt;ClassStudent&gt;()
                      .Add(Subqueries.In("Class_DBID", staffClasses))
                      .SetProjection(Projections.Property("Student_DBID"));
  
                  criteria.Add(Subqueries.In("Student_DBID", studentClasses));
  
                  var students = criteria.List&lt;Student&gt;();
  
                  foreach (var student in students) {
                      Console.WriteLine(string.Format("Student: {0}, {1}", student.LastName, student.FirstName));
                  }
              }
  </code></pre>
  
  <p>When I attempt to run this code, I get the following exception back:</p>
  
  <pre><code>NHibernate.ADOException occurred
    Message=could not execute query
  [ SELECT this_.Student_DBID as Student1_7_0_, this_.DistrictStudentID as District2_7_0_, this_.LastName as LastName7_0_, this_.FirstName as FirstName7_0_, this_.MidName as MidName7_0_, this_.School_DBID as School6_7_0_ FROM [Student] this_ WHERE @p0 in (SELECT this_0_.Student_DBID as y0_ FROM [ClassStudent] this_0_ WHERE @p1 in (SELECT this_0_0_.Class_DBID as y0_ FROM [StaffClass] this_0_0_ WHERE this_0_0_.Staff_DBID = @p2)) ]
  Positional parameters:  #0&gt;Student_DBID #1&gt;Class_DBID #2&gt;3664
  [SQL: SELECT this_.Student_DBID as Student1_7_0_, this_.DistrictStudentID as District2_7_0_, this_.LastName as LastName7_0_, this_.FirstName as FirstName7_0_, this_.MidName as MidName7_0_, this_.School_DBID as School6_7_0_ FROM [Student] this_ WHERE @p0 in (SELECT this_0_.Student_DBID as y0_ FROM [ClassStudent] this_0_ WHERE @p1 in (SELECT this_0_0_.Class_DBID as y0_ FROM [StaffClass] this_0_0_ WHERE this_0_0_.Staff_DBID = @p2))]
    Source=NHibernate
    SqlString=SELECT this_.Student_DBID as Student1_7_0_, this_.DistrictStudentID as District2_7_0_, this_.LastName as LastName7_0_, this_.FirstName as FirstName7_0_, this_.MidName as MidName7_0_, this_.School_DBID as School6_7_0_ FROM [Student] this_ WHERE @p0 in (SELECT this_0_.Student_DBID as y0_ FROM [ClassStudent] this_0_ WHERE @p1 in (SELECT this_0_0_.Class_DBID as y0_ FROM [StaffClass] this_0_0_ WHERE this_0_0_.Staff_DBID = @p2))
    StackTrace:
         at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
         at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
         at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
         at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
         at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
         at NHibernate.Impl.CriteriaImpl.List(IList results)
         at NHibernate.Impl.CriteriaImpl.List[T]()
         at Test.Program.Main(String[] args) in C:\Projects\Test\Test\Program.cs:line 86
    InnerException: System.FormatException
         Message=Failed to convert parameter value from a String to a Int32.
         Source=System.Data
         StackTrace:
              at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)
              at System.Data.SqlClient.SqlParameter.GetCoercedValue()
              at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
              at System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser, SqlParameterCollection parameters)
              at System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior behavior, String commandText, SqlParameterCollection parameters, _SqlRPC&amp; rpc)
              at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
              at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
              at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
              at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
              at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
              at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
              at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
              at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session)
              at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
              at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
              at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
         InnerException: System.FormatException
              Message=Input string was not in a correct format.
              Source=mscorlib
              StackTrace:
                   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer&amp; number, NumberFormatInfo info, Boolean parseDecimal)
                   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
                   at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
                   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
                   at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)
  </code></pre>
  
  <p>What's annoying me right now the most is that the generated SQL is exactly what I want the SQL to look like.  If I run the SQL in SQL Server Managmeent Studio (SQL 2008) with manual parameter replacement I get a correct result set:</p>
  
  <pre><code>SELECT
      this_.Student_DBID as Student1_7_0_, 
      this_.DistrictStudentID as District2_7_0_, 
      this_.LastName as LastName7_0_, 
      this_.FirstName as FirstName7_0_, 
      this_.MidName as MidName7_0_, 
      this_.School_DBID as School6_7_0_ 
  FROM
      [Student] this_ 
  WHERE 
      Student_DBID in (
          SELECT 
              this_0_.Student_DBID as y0_ 
          FROM
              [ClassStudent] this_0_ 
          WHERE Class_DBID in (
              SELECT
                  this_0_0_.Class_DBID as y0_ 
              FROM
                  [StaffClass] this_0_0_ 
              WHERE
                  this_0_0_.Staff_DBID = 3664
          )
      )
  </code></pre>
  
  <p>Where is the attempted parameter conversion coming from?  Why is it happening?  And what can I do to avoid the issue?</p>
  
  <p>Thanks!</p>