2013-04-07 37 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