2012-04-11 17 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