我想限制导航属性返回的模型。例如,我正在使用AuditInfo
模型来记录模型的活动。一旦模型被删除DeletedBy
and Deleted
属性已设置。然而,由于数据库中没有真正“删除”任何内容,因此这些模型仍将填充在其他模型引用的导航属性中。
审计信息类
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)?
(我假设您使用的是 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
{
}
您无法在此处应用过滤器。延迟加载总会加载all给定博客文章的评论。
-
急切加载:
var blogPost = context.BlogPosts.Include(b => b.Comments)
.SingleOrDefault(b => b.Id == 1);
您无法应用过滤器Include
。预加载将始终加载all给定博客文章的评论。
-
显式加载:
加载父级:
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();
不可能在模型定义中应用某种全局过滤策略,以便应用此过滤器all自动执行上述方法,无需在显式加载和投影示例中显式指定。 (我认为您心中有这样一个全局模型定义,但这是不可能的。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)