C# NHibernate/LINQ/filter子集合
我正在尝试在我的服务层中返回一个父对象,该父对象包含我需要筛选的子对象集合。只过滤子对象,因此即使过滤器意味着0个子对象,父对象仍会返回 从下面的代码可以看出,我在这里尝试使用的方法非常简单。我已经研究了其他一些看似相似但尚未得到答案的问题C# NHibernate/LINQ/filter子集合,c#,linq,nhibernate,C#,Linq,Nhibernate,我正在尝试在我的服务层中返回一个父对象,该父对象包含我需要筛选的子对象集合。只过滤子对象,因此即使过滤器意味着0个子对象,父对象仍会返回 从下面的代码可以看出,我在这里尝试使用的方法非常简单。我已经研究了其他一些看似相似但尚未得到答案的问题 我不要求在数据库查询时出现过滤器,尽管如果可能的话也可以 如果使用单个LINQ语句,则筛选所有子对象仍应返回父对象(项目) 我知道这可以通过在映射中添加WHERE子句来解决,但这确实允许级联删除 使用以下代码时,会引发以下异常: 拥有的实体实例Proje
- 我不要求在数据库查询时出现过滤器,尽管如果可能的话也可以
- 如果使用单个LINQ语句,则筛选所有子对象仍应返回父对象(项目)
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需要它的特殊收集类来知道哪些孩子被移除了
我认为你有两种可能:
项目
类中创建一个属性,返回过滤后的集合(但不修改实际的属性
集合),并在需要过滤后的数据的任何地方使用此属性这里有一个很好的答案。但是,它使用
标准
而不是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);
}