我有2个这样的课程:
Parent.cs
public class Parent
{
public int Id {get;set;}
public virtual ICollection<Child> Children { get; set; }
}
Child.cs
public class Child
{
public int Id {get;set;}
public ItemStatusType ItemStatusTyp { get; set; }
public int ParentId {get;set;}
[ForeignKey("ParentId")]
public virtual Parent Parent { get; set; }
}
ItemStatusType.cs
public enum ItemStatusType
{
Active = 1,
Deactive = 2,
Deleted = 3
}
我想要的是以某种方式检索始终 活动,而不是已删除。由于我没有在物理上删除记录,因此我只是将ItemStatusType
更新为Deleted
状态。
因此,当我说ParentObj.Children
时,我只希望在不进一步使用Where
条件的情况下检索有效的那些。
到目前为止,我已经完成了什么,但在运行时给出了我之后说过的例外:
public class ParentConfiguration : EntityTypeConfiguration<Parent>
{
public ParentConfiguration()
{
HasMany(c => c.Children.Where(p => p.ItemStatusTyp != ItemStatusType.Deleted).ToList())
.WithRequired(c => c.Parent)
.HasForeignKey(c => c.ParentId)
;
}
}
运行时异常:
表达式&#c; c =&gt; c.Children.Where(p =&gt;(转换(p.ItemStatusTyp)) != 3))。ToList()&#39;不是有效的属性表达式。表达方式 应该代表一个属性:C#:&#39; t =&gt; t.MyProperty&#39; VB.Net: &#39;功能(t)t.MyProperty&#39;。
我必须在表达式之后使用ToList
,否则它不会编译。
什么是正确的做什么?
提前致谢,
答案 0 :(得分:2)
您不能在流畅的属性映射中使用Where
或任何其他逻辑 - 这只是配置。
基本上你无法以声明的方式解决你需要的东西。
您可以将一些解决方法用于第一级实体,例如实现您自己的扩展程序MySet<T>
,它将返回.Set<T>.Where(x => x.ItemStatusType != ItemStatusType.Deleted)
并在任何地方使用它,但是它不会被使用解决子集合的过滤问题。
您可以努力工作并准备一组单独的实体用于选择数据,这些实体基本上应该基于数据库视图或存储过程;您必须为每个实体创建单独的视图,因此您将能够根据这些视图实体组合选择任何关系。
要插入,您需要将实体映射到&#34;真实&#34;表。不确定它是否值得,但在某些情况下可能会这样。