2011-07-28 45 views
1

我想在我的服務層返回一個父對象,我需要過濾一個集合。只有子對象被過濾,即使過濾器意味着仍然返回Parent對象的子對象。NHibernate/LINQ /過濾器子集合

正如你可以從下面的代碼看到的,我試圖在這裏使用的方法非常簡單。我查看了其他類似的問題,但似乎還沒有得到答案。

  • 我不需要在數據庫查詢時發生過濾器,如果可能的話,也可以。
  • 如果使用單個LINQ語句,那麼過濾所有子對象仍應返回父(項目)。

我知道這可以通過向映射添加WHERE子句來解決,但這可以讓您級聯刪除。

使用下面的代碼下面的異常被拋出:

與級聯集合=「全刪除,孤兒」由所擁有的實體實例不再被引用:Project.Properties

//實體

public class Project 
{ 
    public virtual int Id { get; set; } 

    private ICollection<Property> properties = new List<Property>(); 

    public virtual ICollection<Property> Properties 
    { 
     get { return properties; } 
     set { properties = value; } 
    } 
} 

public class Property 
{ 
    public virtual DateTime? DateDeleted { get; set; } 
} 

//功能NHibernate映射

mapping.HasMany<Property>(x => x.Properties) 
     .ForeignKeyConstraintName("Project_Id") 
     .AsSet() 
     .Cascade.AllDeleteOrphan() 
     .OrderBy("Estate_Id"); 

//服務層:調用項目存儲庫。只有積極性

private ProjectDto GetActiveProject(int id) 
{ 
    var p = projectRepository.Get(id); 

    //filter out deleted properties 
    if (p != null) 
     p.Properties = p.Properties.Where(x => x.DateDeleted == null).ToList(); 

    return projectTransformer.Transform(p); 
} 

回答

1

這裏有一個很好的答案SO。然而它使用Criteria而不是Linq

基本上過濾器是你的朋友在這裏。

1

由於異常消息說,返回的項目,你不允許替換映射與級聯=集合「全刪除,孤兒」,所以不指定任何東西p.Properties。這是因爲NHibernate需要它的特殊集合類來知道哪些孩子被刪除了。

我覺得你有兩種可能性:

  1. 創建的Project類返回篩選集合(但不修改實際Properties集合)的屬性,併到處使用這個屬性,你需要過濾後的數據。
  2. 使用NHibernate過濾器。請參閱here