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即时尝试重新创建:

  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' 

如果我确实正确理解了您的场景,则无法通过QueryOver API实现中间人(外键引用)的连接。 NHibernate需要一直知道pathes,所以如果没有从TranslationContentReferenceContentReferenceContentLibrarySearch显式映射,那么我们就无法创建正确的JoinAliases。

因此,第一种选择是扩展中间人对象

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

然后我们可以导航(创建路径)

  • TranslationContentReferenceContentReference
  • ContentReferenceContentLibrarySearch

第二个选项,即较少的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();