Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate/LINQ/filter子集合_C#_Linq_Nhibernate - Fatal编程技术网

C# NHibernate/LINQ/filter子集合

C# NHibernate/LINQ/filter子集合,c#,linq,nhibernate,C#,Linq,Nhibernate,我正在尝试在我的服务层中返回一个父对象,该父对象包含我需要筛选的子对象集合。只过滤子对象,因此即使过滤器意味着0个子对象,父对象仍会返回 从下面的代码可以看出,我在这里尝试使用的方法非常简单。我已经研究了其他一些看似相似但尚未得到答案的问题 我不要求在数据库查询时出现过滤器,尽管如果可能的话也可以 如果使用单个LINQ语句,则筛选所有子对象仍应返回父对象(项目) 我知道这可以通过在映射中添加WHERE子句来解决,但这确实允许级联删除 使用以下代码时,会引发以下异常: 拥有的实体实例Proje

我正在尝试在我的服务层中返回一个父对象,该父对象包含我需要筛选的子对象集合。只过滤子对象,因此即使过滤器意味着0个子对象,父对象仍会返回

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

  • 我不要求在数据库查询时出现过滤器,尽管如果可能的话也可以
  • 如果使用单个LINQ语句,则筛选所有子对象仍应返回父对象(项目)
我知道这可以通过在映射中添加WHERE子句来解决,但这确实允许级联删除

使用以下代码时,会引发以下异常:

拥有的实体实例Project.Properties不再引用cascade=“all delete orphan”的集合

//实体

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

如异常消息所述,不允许替换映射为cascade=“all delete orphan”的集合,因此不要将任何内容分配给
p.Properties
。这是因为NHibernate需要它的特殊收集类来知道哪些孩子被移除了

我认为你有两种可能:

  • 项目
    类中创建一个属性,返回过滤后的集合(但不修改实际的
    属性
    集合),并在需要过滤后的数据的任何地方使用此属性
  • 使用NHibernate过滤器。看

  • 这里有一个很好的答案。但是,它使用
    标准
    而不是
    Linq

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

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