2013-04-07 56 views
0

我有一個查詢,由於性能的原因,我需要使用原始ADO.NET製作實際的命令(它涉及表值參數)。使用LINQ to SQL或EF,我可以簡單地將由DbCommand.ExecuteReader()返回的DbDataReader傳遞給DataContext.Translate<T>(DbDataReader)ObjectContext.Translate<T>(DbDataReader)方法,並將結果集轉換爲對象,返回IEnumerable<T>NHibernate的等效LINQ to SQL的和EF的翻譯<T>()

是否有任何NHibernate的API相當於,我可以通過一個DbDataReader/IDataReader甚至是DbCommand/IDbCommand並得到NHibernate的實體回來?

或者也許有一種方法可以攔截由ISession.CreateQuery(string)創建的命令的構造,以便我可以修改底層的DbCommand以按我需要的方式工作?

+0

有什麼理由不能使用'CreateSQLQuery'? – mickfold 2013-04-07 15:44:16

+0

@penfold:是的,因爲,正如我所提到的,我需要使用表值參數。 – 2013-04-07 17:19:44

回答

1

您可以創建一個自定義UserType來處理表值參數。

NHibernate不公開任何公共方法中的DataReader - >實體轉換。

+0

看來這是一個開始的好地方。 'IUserType.NullSafeSet()'有一個'IDbCommand'類型的參數,這是我需要添加表值參數。 – 2013-04-07 19:55:41

+0

這確實是最簡單的工作方式,謝謝!我到了可以執行以下操作的地步:'session.CreateSQLQuery(「SELECT * FROM Customers WHERE Id IN(SELECT Value FROM:tableType)」)'。但是這需要調用'IQuery.AddEntity()'等。我嘗試通過使用HQL移動一個抽象級別,如下所示:'session.CreateQuery(「FROM Customers WHERE Id IN(SELECT Value FROM:tableType)」)',但拋出了一個'Antlr.Runtime.NoViableAltException'。我想要讓LINQ能夠使用它,但不是HQL的下一個邏輯步驟?也許我需要跳過HQL? – 2013-04-08 13:33:19

+0

我認爲如果不進行更深入的黑客攻擊,我們認爲你不會比SQL更高。只保留SQL。 – 2013-04-08 13:56:16