NHibernate / LINQ / filter子集合

时间:2011-07-28 02:24:00

标签: c# linq nhibernate

我正在我的服务层中尝试返回一个Parent,该Parent包含我需要过滤的Child对象的集合。只有子对象被过滤,所以即使过滤器意味着0个子对象,仍然会返回父对象。

从下面的代码中可以看出,我在这里尝试使用的方法非常简单。我已经研究了其他似乎相似但尚未得到答案的SO问题。

  • 我不要求在数据库查询中使用过滤器,尽管如果可能的话也没问题。
  • 如果使用单个LINQ语句,则过滤所有子对象仍应返回Parent(Project)。

我知道这可以通过向Mapping添加WHERE子句来解决,但这确实可以让你级联删除。

使用以下代码时,抛出以下异常:

拥有实体实例不再引用具有cascade =“all-delete-orphan”的集合: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; }
}

// Fluent NHibernate Mapping

  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);
}

2 个答案:

答案 0 :(得分:1)

正如异常消息所示,您不能替换使用cascade =“all-delete-orphan”映射的集合,因此请勿向p.Properties分配任何内容。这是因为NHibernate需要它的特殊集合类才能知道删除了哪些孩子。

我认为你有两种可能性:

  1. Project类中创建一个返回已过滤集合的属性(但不会修改实际的Properties集合),并在需要过滤数据的任何位置使用此属性。
  2. 使用NHibernate过滤器。见here

答案 1 :(得分:1)

SO有一个很好的答案。但是,它使用Criteria而不是Linq

基本上过滤器是你的朋友。