私はこのような2つのクラスがあります。C#EntityFramework 6.0 - EntityTypeConfigurationのWhereステートメントの使い方
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.Childrenここ
は、これまで私が行ったが、私は後で述べ実行時に例外を与えてきたものです。 Where(p =>(Convert(p.ItemStatusTyp) != 3))。ToList() 'は有効なプロパティ式ではありません。式 は、プロパティを表す必要があります。C#: 't => t.MyProperty' VB.Net: 'Function(t)t.MyProperty'。
ToList
を式の後に使用しなければなりません。それ以外の場合はコンパイルされません。
私は何をしたいのですか?事前に
おかげで、
それはできません。それがデータベース内でどのように見えるかを想像してみてください。基本的に設定が設定しているものです。 – DavidG
EFは、このような開発者に優しいキャンディーでは常に不毛である。NHibernateは機能が豊富で、EFの優れたLINQサポートでなければほとんど切り替えるでしょう。したがって、条件付きのナビゲーションプロパティをコンフィグレーションすることはできません。グローバルフィルタを提供するサードパーティのライブラリに頼るか、ソフト削除を実装するためのより洗練された方法を見つけることができます。 –