2009-07-02 97 views
0

有没有什么办法可以获得NHibernate作为运行查询结果放入ICriteria对象的对象类型?在这个代码示例中,如果它们不为null,则可以获取我的对象的类型,但如果它们是?另外,根据返回的数据,一个“行”(object [])可能在其他行不存在的地方有空字段 - 迫使我枚举所有行(最坏情况)以确定每列(对象的索引[]) 应该。NHibernate ICriteria和预期类型

在哪里可以找到对象的预期类型(我创建的数组中的每个对象的预期类型 - 显然它不会在我的数组上,但我希望它在某处ICriteria层次结构)?

DetachedCriteria dc = DetachedCriteria.For<MyObject>().Add(...).SetProjection(...); 

IList<object[]> list = dc.GetExecutableCriteria(session).List().OfType<object[]>().ToList(); 

foreach(object [] o in list) 
{ 
    foreach(object p in o) 
    { 
     if(p != null) 
     Type t = p.GetType(); 
     else 
     throw new ApplicationException("Query returned null for column"); 
    } 
} 

我问这是因为不得不实际检查由NHibernate返回的结果似乎是错误的方式去做这件事。反射似乎也没有任何帮助,因为在检查返回的ICriteria对象(CriteriaImpl对象)时,我无法在任何地方找到对象类型的实例,而是在实际结果“row”/“column”中找到对象。

我问,因为我试图从一个NHibernate的结果动态创建一个DataTable,我希望有强类型的列。

+0

为什么试图从NHibernate构建数据集?似乎毫无意义,如果你真的需要使用数据集ADO.NET – sirrocco 2009-07-04 10:02:31

+0

如果我选择使用ADO.NET,那么我必须跟踪我宁愿让NHibernate处理的许多事情(方言,加入,标准,等等 - 我必须解析所有文本并自己重新组合 - 不是小任务)。 我的问题源于我的用户可能会将自定义列添加到数据库并查询它们,我希望能够从NHibernate获取列类型。 – Michael 2009-07-06 15:22:57

回答

0

返回的类型是您查询的类型。如果您的用户正在添加自定义列并自由查询,则不会知道您要查询的内容,因此,如果不检查实际对象,就无法获得强类型结果。

AFAIK这是NHibernate的限制。