【问题标题】:NHibernate / LINQ / filter child collectionNHibernate / LINQ / 过滤子集合
【发布时间】:2011-07-28 02:24:00
【问题描述】:

我试图在我的服务层中返回一个父对象,该父对象包含一组我需要过滤的子对象。仅过滤子对象,因此即使过滤器表示 0 个子对象,仍会返回父对象。

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

  • 我不要求在数据库查询中出现过滤器,但如果可能的话,那也没关系。
  • 如果使用单个 LINQ 语句,则过滤所有子对象仍应返回父对象(项目)。

我知道这可以通过在 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; }
}

//流畅的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);
}

【问题讨论】:

    标签: c# linq nhibernate


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      正如异常消息所说,您不能替换映射为 cascade="all-delete-orphan" 的集合,因此不要将任何内容分配给 p.Properties。这是因为 NHibernate 需要它的特殊集合类来知道哪些子元素被删除了。

      我认为你有两种可能:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        相关资源
        最近更新 更多