2017-03-24 10 views
1

私はこのような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 
    } 

は何とか取得することです常にアクティブのもので、は削除されていません。のものです。物理的にレコードを削除しないので、ItemStatusTypeDeletedステータスに更新するだけです。

私が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を式の後に使用しなければなりません。それ以外の場合はコンパイルされません。

私は何をしたいのですか?事前に

おかげで、

+0

それはできません。それがデータベース内でどのように見えるかを想像してみてください。基本的に設定が設定しているものです。 – DavidG

+0

EFは、このような開発者に優しいキャンディーでは常に不毛である。NHibernateは機能が豊富で、EFの優れたLINQサポートでなければほとんど切り替えるでしょう。したがって、条件付きのナビゲーションプロパティをコンフィグレーションすることはできません。グローバルフィルタを提供するサードパーティのライブラリに頼るか、ソフト削除を実装するためのより洗練された方法を見つけることができます。 –

答えて

2

あなたはWhereまたは流暢なプロパティマッピングの他のロジックを使用することはできません - それはただの構成です。

基本的に宣言的な方法で必要なものを解決することはできません。

独自の拡張子MySet<T>を実装して.Set<T>.Where(x => x.ItemStatusType != ItemStatusType.Deleted)を返すような、第1レベルのエンティティに使用できるいくつかの回避策がありますが、それは子コレクションのフィルタリングの問題を解決しません。

基本的にデータベースビューまたはストアドプロシージャに基づいてデータを選択するために、別のエンティティセットを用意することができます。エンティティごとに別々のビューを作成する必要があるため、これらのビューに基づいて任意のリレーションで選択を組み合わせることができます(エンティティ)。

エンティティを "実際の"テーブルにマップする必要がありますが、挿入するには挿入します。それが価値があるかどうかは確かですが、場合によってはそうかもしれません。

+0

これは面倒です..ありがとうございます。私はあなたの提案をすぐにお試しになります。 –

+0

もう少し試してみたところ、あなたがきれいに働いていたように私は実装しました。ありがとうございました。 –

関連する問題