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

时间:2017-03-24 11:45:24

标签: c# linq entity-framework-6 linq-to-entities

我有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,否则它不会编译。

什么是正确的做什么?

提前致谢,

1 个答案:

答案 0 :(得分:2)

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

基本上你无法以声明的方式解决你需要的东西。

您可以将一些解决方法用于第一级实体,例如实现您自己的扩展程序MySet<T>,它将返回.Set<T>.Where(x => x.ItemStatusType != ItemStatusType.Deleted)并在任何地方使用它,但是它不会被使用解决子集合的过滤问题。

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

要插入,您需要将实体映射到&#34;真实&#34;表。不确定它是否值得,但在某些情况下可能会这样。