2011-03-17 56 views
5

我試圖在從另一個表加入(並投影)的列上應用篩選器(ApplyFilter)。我有以下實體:Fluent Nhibernate ApplyFilter加入列

public class User 
{ 
    public virtual int Id { get; private set; } 
    public virtual string EMail { get; set; } 
    ... 
    public virtual bool IsActive { get; set; } 
    public virtual int CompanyId { get; set; } 
} 

隨着用戶映射:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("Users"); 
     Id(x => x.Id, "UserId"); 
     Map(x => x.EMail); 
     ... 

     Join("CompanyUser", r => 
     { 
      r.KeyColumn("UserId"); 
      r.Map(x => x.IsActive); 
      r.Map(x => x.CompanyId); 
      r.Fetch.Join(); 

     }); 

     ApplyFilter<CompanyFilter>("this_1_.CompanyId = :companyId"); 
    } 

這實際工作的權利,但你可以看到我有包括別名「this_1_」爲CompanyUser表中的過濾器......這聽起來並不正確,但是如果我離開過濾器在FilterDefinition類中定義,我得到了一個SQL:

where this.CompanyId = ?p0 

未COS的CompanyId列映射」 C (公司用戶this_1_1)

有沒有辦法糾正這個問題,讓nhibernate找出過濾器的正確別名?

在此先感謝您的幫助。

+0

我很想知道這個問題的答案了。你找到了一個更好的解決辦法? – pauldunlop 2011-06-27 13:32:29

+0

今天的任何解決方案? – RMalke 2012-10-17 02:19:38

+0

@RenanMalkeStigliani不,我最終只是和它一起生活,我還沒有找到解決方案....我一定會在這裏發佈它,如果我找到它 – Jaime 2012-10-17 21:58:34

回答

0

我想你一定應用濾鏡的加入:

Join("CompanyUser", r => 
    { 
     r.KeyColumn("UserId"); 
     r.Map(x => x.IsActive); 
     r.Map(x => x.CompanyId); 
     r.Fetch.Join(); 

    }).ApplyFilter<CompanyFilter>("CompanyId = :companyId"); 
+0

謝謝你的回答,我是不知道,這雖然解決了我的問題,「this_1_.CompanyId」引用被硬編碼在映射類......所以當我加入與具有companyId其他實體的用戶,在「this_1_.companyId」的東西應該是「this_2_」 ... – Jaime 2011-07-17 18:41:08

+0

你可以嘗試新的版本(我的編輯之後)?我認爲NHibernate的解析過濾器,並在需要時添加正確的別名。 – 2011-07-19 21:20:45