Ý tưởng đầu tiên của tôi, đặc biệt, là triển khai IType
của riêng tôi .
public class Sql2008Structured : IType {
private static readonly SqlType[] x = new[] { new SqlType(DbType.Object) };
public SqlType[] SqlTypes(NHibernate.Engine.IMapping mapping) {
return x;
}
public bool IsCollectionType {
get { return true; }
}
public int GetColumnSpan(NHibernate.Engine.IMapping mapping) {
return 1;
}
public void NullSafeSet(DbCommand st, object value, int index, NHibernate.Engine.ISessionImplementor session) {
var s = st as SqlCommand;
if (s != null) {
s.Parameters[index].SqlDbType = SqlDbType.Structured;
s.Parameters[index].TypeName = "IntTable";
s.Parameters[index].Value = value;
}
else {
throw new NotImplementedException();
}
}
#region IType Members...
#region ICacheAssembler Members...
}
Không có nhiều phương pháp được thực hiện; a throw new NotImplementedException();
mới là trong tất cả các phần còn lại. Tiếp theo, tôi đã tạo một tiện ích mở rộng đơn giản cho IQuery
.
public static class StructuredExtensions {
private static readonly Sql2008Structured structured = new Sql2008Structured();
public static IQuery SetStructured(this IQuery query, string name, DataTable dt) {
return query.SetParameter(name, dt, structured);
}
}
Cách sử dụng điển hình đối với tôi là
DataTable dt = ...;
ISession s = ...;
var l = s.CreateSQLQuery("EXEC some_sp @id = :id, @par1 = :par1")
.SetStructured("id", dt)
.SetParameter("par1", ...)
.SetResultTransformer(Transformers.AliasToBean<SomeEntity>())
.List<SomeEntity>();
Được, nhưng "IntTable"
là gì ? Đó là tên của kiểu SQL được tạo để chuyển đối số giá trị bảng.
CREATE TYPE IntTable AS TABLE
(
ID INT
);
Và some_sp
có thể giống như
CREATE PROCEDURE some_sp
@id IntTable READONLY,
@par1 ...
AS
BEGIN
...
END
Tất nhiên, nó chỉ hoạt động với Sql Server 2008 và trong cách triển khai cụ thể này với DataTable
một cột duy nhất .
var dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
Đó chỉ là POC, không phải là một giải pháp hoàn chỉnh, nhưng nó hoạt động và có thể hữu ích khi được tùy chỉnh. Nếu ai đó biết giải pháp tốt hơn / ngắn hơn, hãy cho chúng tôi biết.