Я хотел бы передать двухколоночный табличный параметр (TVP) на ISQLQuery
:
var sql = "INSERT INTO PersonalTaste (PersonID, ThingID, Score) " +
"SELECT :personID, o.thingID, o.score " +
"FROM :scoreObject o";
var query = session.CreateSQLQuery(sql);
query.SetInt32("personID", fred.ID);
query.SetParameterList("scoreObject", fredsTastes.Select(t => new {
thingID = t.Thing.ID,
score = t.Score
}).ToArray() /*, Optional IType hint here */);
query.ExecuteUpdate();
Когда я это делаю (или пытаюсь намекнуть IType
как NHibernateUtil.Object
или NHibernateUtil.Class
), NHibernate жалуется:
NHibernate.HibernateException
: Не удалось определить тип для класса:<>f__AnonymousType5`2[[System.Int32],[System.String]]
Он также жалуется, что я пытаюсь создать struct
со свойствами для thingID
и score
и сделать массив из них вместо анонимных объектов. Единственное, что меняется, это тип, который он "не мог определить".
Microsoft кажется, говорит, что TVP может иметь любые столбцы, которые вы хотите:
// Assumes connection is an open SqlConnection. using (connection) { // Create a DataTable with the modified rows. DataTable addedCategories = CategoriesDataTable.GetChanges( DataRowState.Added); // Define the INSERT-SELECT statement. string sqlInsert = "INSERT INTO dbo.Categories (CategoryID, CategoryName)" + " SELECT nc.CategoryID, nc.CategoryName" + " FROM @tvpNewCategories AS nc;" // Configure the command and parameter. SqlCommand insertCommand = new SqlCommand( sqlInsert, connection); SqlParameter tvpParam = insertCommand.Parameters.AddWithValue( "@tvpNewCategories", addedCategories); tvpParam.SqlDbType = SqlDbType.Structured; tvpParam.TypeName = "dbo.CategoryTableType"; // Execute the command. insertCommand.ExecuteNonQuery(); }
Есть ли способ убедить NHibernate сделать TVP с именованными столбцами? Я хотел бы избежать написания моего собственного IType
.