2010-07-29 87 views
1

我希望有人可以幫助這個請。
我想用NHibernate查詢一個OLAP事實表,但我努力讓它工作。它似乎是一個簡單的要求,但我不能看到問題可能是什麼。
我有一個具有多個維度表的中央事實表,其中一個維度具有輔助維度。

所以ERD是。事實> --- 1 Factor_Dim> --- 1 Target_Dim

我的NHibernate查詢是。NHibernate的CreateCriteria查詢問題

事實= session.CreateCriteria(typeof運算(事實), 「事實」)
.CreateAlias( 「facts.FactorDimension」, 「factDim」,JoinType.InnerJoin)
.CreateAlias( 「factDim.TargetDimension」 ,「targetDim」,JoinType.InnerJoin)
.Add(Restrictions.Eq(「targetDim.TargetID」,targetId))
.List();

錯誤是「多部分標識符」targetdim2_.TargetID「無法綁定」。生成的SQL在From子句中沒有Factor_DIM或Target_DIM表。

是否有任何替代技術來使此查詢工作?如果可能的話,我喜歡堅持這種風格,而不是CreateSQLQuery()。

請幫忙。謝謝。

+1

如何使用NHibernate的強類型化/流暢LINQ而不是有時候遮擋的Criteria API? http://bit.ly/d5xwIB – rebelliard 2010-07-29 12:28:08

+1

如果沒有看到映射,就不能說太多... – dotjoe 2010-07-29 20:34:47

回答

0

Linq或QueryOver將成爲您最乾淨的解決方案。如果你決定留在ICriteria中,你可能會想要將你的每個實體都包裝在一個擁有通用粗粒方法的類中,這也使得你的代碼訪問變得很普通,所以代碼糾正在一個地方完成,而不是在文件或類。

Theres大量的項目在http://nhforge.org/wikis/general/open-source-project-ecosystem.aspx它可以幫助你。我知道NhGen(http://sourceforge.net/projects/nhgen/)基於NHibernate.Burrows GenericDao類爲每個實體創建了一個CRUD類,並帶有一些CRUD方法。它負責所有的別名和連接,以便查詢成爲

IMessageDao messageDao = new MessageDao(); 
// Get All 
IList<IMessage> messageList1 dao.FindAll(); 
// Find using QueryByExample 
IList<IMessage> messageList2 = dao.FindByExample(messageDetails, orderBy)).ToList(); 
// Find using a simple entity query 
IList<IMessage> messageList3 = messageDao.Find(new [] { Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked) }); 
// Find using a join and a query on said joined entities 
IList<IMessage> messageList4 = messageDao.Find 
(new [] 
    { 
     Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked), 
     Restrictions.Eq(MessageHelper.Columns.IsActive, true)) 
    }, new[] 
    { 
     Restrictions.Eq(CategoryHelper.KeyColumns.Rsn, categoryRsn), 
     Restrictions.Eq(CategoryHelper.Columns.IsActive, true)) 
    }, new [] 
    { 
     Restrictions.Eq(ChannelHelper.KeyColumns.Rsn, channelRsn), 
     Restrictions.Eq(ChannelHelper.Columns.IsActive, true)) 
    } 
); 

theres大量那樣簡單

覆蓋的,所以你可以指定你的連接類型或它自然假設內連接。