4

ナビゲーション プロパティによって返されるモデルを制限したい。たとえば、AuditInfoモデルのアクティビティをログに記録するためにモデルを使用しています。モデルが削除されると、DeletedByおよびDeleted属性が設定されます。ただし、データベースから実際に「削除」されるものは何もないため、これらのモデルは、他のモデルによって参照されるナビゲーション プロパティに取り込まれます。

AuditInfo クラス

public class AuditInfo
{
    [Key]
    public int AuditInfoID { get; set; }

    //Other attributes

    public string DeletedBy { get; set; }

    public DateTime? Deleted { get; set; }
}

ナビゲーション プロパティを持つクラス

public class BlogPost
{
    //Other attributes

    //Only return Comment where Comment.AuditInfo.Deleted is NULL
    public virtual IList<Comment> Comments { get; set; }
}

監査中のクラス

public class Comment
{
    //Other attributes

    public int AuditInfoID { get; set; }
}

BlogPost.Comments からの削除されていないコメント (Comment.AuditInfo.Deleted が NULL) のみになるように制約を設定するにはどうすればよいですか?

4

3 に答える 3

5

(属性のために、EF Code-First を使用していると思い[Key]ます。)

ナビゲーション プロパティと関連エンティティを読み込むにはさまざまな方法があり、これらの方法の一部にフィルターを適用できますが、すべてに適用できるわけではありません。

  • 遅延読み込み:

    virtual遅延読み込みがまったく機能するように、ナビゲーション プロパティを次のようにする必要があります。

    public virtual IList<Comment> Comments { get; set; }
    

    親を読み込んでいます:

    var blogPost = context.BlogPosts.Find(1);
    foreach (var comment in blogPost.Comments) // lazy loading triggered here
    {
    }
    

    ここではフィルターを適用できません。遅延読み込みは、特定のブログ投稿のすべてのコメントを常に読み込みます。

  • 熱心な読み込み:

    var blogPost = context.BlogPosts.Include(b => b.Comments)
        .SingleOrDefault(b => b.Id == 1);
    

    ではフィルタを適用できませんInclude。Eager ローディングでは、特定のブログ投稿のすべてのコメントが常にロードされます。

  • 明示的な読み込み:

    親を読み込んでいます:

    var blogPost = context.BlogPosts.Find(1);
    

    コメントをロードするときにフィルターを適用できます。

    context.Entry(blogPost).Collection(b => b.Comments).Query()
        .Where(c => !c.AuditInfo.Deleted.HasValue)
        .Load();
    
  • 投影:

    投影されたプロパティにフィルターを適用できます。

    var blogPost = context.BlogPosts
        .Where(b => b.Id == 1)
        .Select(b => new
        {
            BlogPost = b,
            Comments = b.Comments.Where(c => !c.AuditInfo.Deleted.HasValue)
        })
        .SingleOrDefault();
    

モデル定義にある種のグローバル フィルター ポリシーを適用することはできません。このフィルターは、明示的な読み込みとプロジェクションの例で明示的に指定せずに、上記のすべてのメソッドに自動的に適用されます。(そのようなグローバルなモデル定義を念頭に置いていると思いますが、それは不可能です。)

于 2012-07-19T21:13:38.403 に答える
1

カスタム プロパティをエンティティ クラスに追加して、ナビゲーション プロパティを使用しますが、それをフィルタリングして、フィルタリングされたデータを返しますか?

于 2012-07-19T20:37:54.100 に答える
0

削除されたエントリを除外する SQL ビューにエンティティをマップします。

于 2012-07-19T20:22:48.517 に答える