2012-12-10 98 views
3

基本上我想要做的就是在外键上连接两个表。我有这个疑问:nhibernate joinqueryover无关表(相同的外键)

 var result = 
      _session.QueryOver(() => contentReferenceAlias) 
        .Inner.JoinAlias(() => contentReferenceAlias.ContentReference,() => contentLibrarySearchAlias.ContentReference) 
        .Where(() => contentReferenceAlias.ToLanguage.Id == languageId && contentReferenceAlias.ContentReference.Id == contentLibrarySearchAlias.ContentReference.Id) 
        .SelectList(list => list 
              .Select(() => contentReferenceAlias.ContentReference) 
              .Select(() => contentLibrarySearchAlias.ContentReference) 
              .Select(() => contentReferenceAlias.ContentReference.Id).WithAlias(() => resultAlias.ContentReferenceId) 
              .Select(() => contentReferenceAlias.ContentReference.Id).WithAlias(() => resultAlias.ContentReferenceId) 
              .Select(() => contentReferenceAlias.OrderedFrom).WithAlia 

的SQL IM试图重建:

SELECT A.OrderedFrom, C.LastOrdered, A.ContentReferenceId, B.Title FROM TranslationContentReference A 
    INNER JOIN TranslationOrder C ON (A.TranslationOrderId = C.Id) 
    INNER JOIN ContentLibrarySearch B ON (A.ContentReferenceId = b.ContentReferenceId) 
    WHERE A.ToLanguageId = 'xxxx-xxxx-xxxx-xxxx-xxxx' 

回答

1

如果我理解正确的情况下,加入了人在这方面的中间人(外键参考)不能通过QueryOver API实现。 NHibernate需要知道一路下来,所以如果没有从TranslationContentReferenceContentReferenceContentLibrarySearch的明确映射,那么我们不能创建正确的JoinAliases。

所以,第一个选项是将人在这方面的中间人对象

public class ContentReference 
{ 
    ... 
    public virtual IList<TranslationContentReference> TranslationContentReference { get; set;} 
    public virtual IList<ContentLibrarySearch> ContentLibrarySearch { get; set;} 
} 

然后我们就可以导航(创建pathes)

  • TranslationContentReferenceContentReference延伸到ContentReference
  • ContentLibrarySearch

第二个选项,这是少NHibernate和更多的SQL,是创造ISQLQuery

ISQLQuery query = session.CreateSQLQuery(
    "SELECT A.OrderedFrom, C.LastOrdered, A.ContentReferenceId, B.Title 
    FROM TranslationContentReference A 
    INNER JOIN TranslationOrder C ON (A.TranslationOrderId = C.Id) 
    INNER JOIN ContentLibrarySearch B ON (A.ContentReferenceId = b.ContentReferenceId) 
    WHERE A.ToLanguageId = :language"); 
query.SetString("language", "xxxx-xxxx-xxxx-xxxx-xxxx"); 
var result = query.SetResultTransformer(new AliasToBeanResultTransformer(typeof(MyDTO))) 
.List(); 
+0

我与创建SQL查询选项去,是对目标的最快方法,因为业绩是整个之所以这样做,这似乎是最好的主意。感谢您的回答,并验证我正在尝试做一些“不可能的事情”。 – ruffen

+0

是的,这是正确的。通过NHibernate基础设施(结果转换器)有点复杂的SQL语句。如此强大;) –