C#EntityFramework 6.0-如何在EntityTypeConfiguration中使用Where语句?

C#EntityFramework 6.0-如何在EntityTypeConfiguration中使用Where语句?,c#,linq,entity-framework-6,linq-to-entities,C#,Linq,Entity Framework 6,Linq To Entities,我有两门课是这样的: Parent.cs public class Parent { public int Id {get;set;} public virtual ICollection<Child> Children { get; set; } } ItemStatusType.cs public enum ItemStatusType { Active = 1, Deactive = 2, Deleted =

我有两门课是这样的:

Parent.cs

public class Parent
{
   public int Id {get;set;}
   public virtual ICollection<Child> Children { 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)
                ;
     }
}
公共类ParentConfiguration:EntityTypeConfiguration
{
公共父配置()
{
HasMany(c=>c.Children.Where(p=>p.ItemStatusTyp!=ItemStatusType.Deleted).ToList())
.WithRequired(c=>c.Parent)
.HasForeignKey(c=>c.ParentId)
;
}
}
运行时异常:

表达式'c=>c.Children.Where(p=>(Convert(p.ItemStatusTyp) !=3)).ToList()不是有效的属性表达式。表情 应表示一个属性:C#::“t=>t.MyProperty”VB.Net: “函数(t)t.MyProperty”

我必须在表达式之后使用
ToList
,否则它无法编译

做我想做的事的正确方法是什么


提前感谢,

您不能在fluent属性映射中使用
Where
或任何其他逻辑-这只是配置

基本上,您不能用声明的方式解决您需要的问题

有一些变通方法可以用于第一级实体,比如实现自己的扩展名
MySet
,它将返回
.Set.Where(x=>x.ItemStatusType!=ItemStatusType.Deleted)
并在任何地方使用,但这并不能解决子集合的筛选问题

您可以努力准备一组单独的实体用于选择数据,这些实体基本上应该基于数据库视图或存储过程;您必须为每个实体创建单独的视图,以便能够在基于这些视图的任何关系中组合选择实体


对于插入,您需要在“真实”表上映射实体。不确定它是否值得,但在某些情况下可能值得。

你不可能做到这一点。想象一下,在数据库中会是什么样子,这基本上就是配置所设置的。EF在这样的开发人员友好型糖果中一直是贫瘠的。NHibernate的功能更加丰富,如果没有EF卓越的LINQ支持,我几乎要换掉它了。因此,不能使用条件配置导航属性。您可能想求助于提供全局筛选器的第三方库,或者寻找更复杂的方法来实现软删除。这太可惜了。。非常感谢。我会立即尝试你的建议。在尝试了几件事情之后,我按照你说的实现了,并且工作得很好。非常感谢。
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)
                ;
     }
}