2012-04-11 45 views
3

尽管建立映射是Not.Nullable()Not.LazyLoad()Nhibernate的生成OUTER JOIN用于取

出于某种原因,NH与INNER接合表两次,一次JOIN安抚WHERE,其次在OUTER JOIN到选择数据。

当然,正如我们已经加入了数据,这将是有意义的只是使用连接表...

SELECT 
    ...Tables.. 
from Tasks taskentity0_, 
outer Cases caseentity1_, 
outer Grades gradeentit2_, 
Cases caseentity5_ 
WHERE 
.... 

我的LINQ查询是这样的:

IQueryable<TaskEntity> tasks = TaskRepo.Find(
    t => t.DueDate <= DateTime.Now 
     && (t.TaskInitials == userInitials || (t.TaskInitials == "" || t.TaskInitials == null)) 
     && t.Team.GST.Any 
        (x => x.Initials == userInitials 
         && x.WorkType.WorkTypeCode == t.WorkType.WorkTypeCode 
         && x.Team.TeamCode == t.Team.TeamCode 
        ) 
     && (t.Case.CaseOnHold <= DateTime.Now || t.Case.CaseOnHold == null || (t.SingleTask == "M" || t.SingleTask == "m")) 
     && (t.Case.CaseMatter.StartsWith("0") || t.Case.CaseMatter.StartsWith("9")) 
       ).Fetch(t => t.Case,FetchProvider) 

我参考图:

 References(x => x.Case).Column("ta_c_ref").Not.Nullable(); 

想法?

我们正在使用存储库模式,并重新实现了Fetch扩展方法以这种方式工作(因此传入了FetchProvider)。

而且,QueryOver<T>是不是一个不错的选择,因为我们需要IQueryable秒。

我使用NH 3.1。

对群众举报:

我们不再使用fetch或LINQ,我们搬到了HQL ...

/// <summary> 
    /// Interfaces for Fetch() statements 
    /// </summary> 

    public interface IFetchingProvider 
    { 
     IFetchRequest<TOriginating, TRelated> Fetch<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector); 

     IFetchRequest<TOriginating, TRelated> FetchMany<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, IEnumerable<TRelated>>> relatedObjectSelector); 

     IFetchRequest<TQueried, TRelated> ThenFetch<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, TRelated>> relatedObjectSelector); 

     IFetchRequest<TQueried, TRelated> ThenFetchMany<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, IEnumerable<TRelated>>> relatedObjectSelector); 
    } 


public class NhFetchingProvider : IFetchingProvider 
    { 
     public IFetchRequest<TOriginating, TRelated> Fetch<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector) 
     { 
      var fetch = EagerFetchingExtensionMethods.Fetch(query, relatedObjectSelector); 
      return new FetchRequest<TOriginating, TRelated>(fetch); 
     } 

     public IFetchRequest<TOriginating, TRelated> FetchMany<TOriginating, TRelated>(IQueryable<TOriginating> query, Expression<Func<TOriginating, IEnumerable<TRelated>>> relatedObjectSelector) 
     { 
      var fecth = EagerFetchingExtensionMethods.FetchMany(query, relatedObjectSelector); 
      return new FetchRequest<TOriginating, TRelated>(fecth); 
     } 

     public IFetchRequest<TQueried, TRelated> ThenFetch<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, TRelated>> relatedObjectSelector) 
     { 
      var impl = query as FetchRequest<TQueried, TFetch>; 
      var fetch = EagerFetchingExtensionMethods.ThenFetch(impl.NhFetchRequest, relatedObjectSelector); 
      return new FetchRequest<TQueried, TRelated>(fetch); 
     } 

     public IFetchRequest<TQueried, TRelated> ThenFetchMany<TQueried, TFetch, TRelated>(IFetchRequest<TQueried, TFetch> query, Expression<Func<TFetch, IEnumerable<TRelated>>> relatedObjectSelector) 
     { 
      var impl = query as FetchRequest<TQueried, TFetch>; 
      var fetch = EagerFetchingExtensionMethods.ThenFetchMany(impl.NhFetchRequest, relatedObjectSelector); 
      return new FetchRequest<TQueried, TRelated>(fetch); 
     } 
} 

public static IFetchRequest<TOriginating, TRelated> Fetch<TOriginating, TRelated>(this IQueryable<TOriginating> query, Expression<Func<TOriginating, TRelated>> relatedObjectSelector, Func<IFetchingProvider> FetchingProvider) 
     { 
      return FetchingProvider().Fetch(query, relatedObjectSelector); 
     } 
+0

存储库模式杀死了NHibernate的功能。我的意见和其他许多人都有同样的想法。 – CrazyCoderz 2012-04-20 14:01:02

+0

这将有助于看到获取扩展源代码.. – Hoghweed 2012-12-17 15:20:04

+0

从历史更新 - 铭记在心,代码现在已近一年的时间,并未被使用。 – 2012-12-17 16:30:56

回答

0

使用与NHibernate的LINQ内部联接尚不支持。更多信息可以在这里找到:https://nhibernate.jira.com/browse/NH-2790

+0

谢谢你 - 将它添加到JIRA似乎将它添加到我的亚马逊愿望清单中很有用 - 但嘿,好吧,它可能会发生! – 2013-06-13 08:25:06

+1

@ Stuart.Sklinar伤心,但真实。 – TedOnTheNet 2013-06-13 13:53:42

0

我已经加入了它的支持!

https://www.nuget.org/packages/NHibernate.Linq.InnerJoinFetch

Enjoy !!!

+0

这是开源的吗?你能链接 - Github?所以我们提供改进,叉等....? – 2013-06-18 12:34:23

+2

这是,在Nuget页面上点击Project Site或点击https://github.com/eallegretta/nhibernate-linq-innerjoin-fetch – Paleta 2013-06-18 22:27:34