我一直在测试EF 4,我正在寻找过滤对象上的子集合.
我正在使用POCO支持并让EF自动连接我的集合:
public virtual ICollection<Product> Products { get; set; }
所以在这个例子中,我可以获得一个类别的实例,然后枚举它的产品.
我想知道的是,我如何过滤这个集合,比如说只返回活跃的产品.我知道我可以在内存中执行此操作,但重要的是将条件直接发送到数据库.
在NHibernate中我可以使用我的集合中的过滤器来做到这一点,在EF 4中是否有相同的东西?
我确实考虑过创建另一个集合,例如
public virtual ICollection<Product> ActiveProducts {get;set;}
但我不确定如何将其连接起来.
谢谢,
本
最佳答案 不幸的是,当前版本的Entity Framework无法正式实现这一点.我花了一些时间自己深入研究这个问题.我相信你可以使用一些基于反射的代码来改变默认行为,但我认为这会有点复杂.
我不是DDD专家,但我认为更正确的方法是使用特定的查询来获取给定类包含类的实体的活动产品.您可以在存储库或查询类中找到它.如果出于效率原因(这是我的情况)需要阻止其他人访问此属性,您可能希望将其从实体类中删除,并使查询成为访问活动产品的唯一方法.
如果您仍想进行数据库端集合过滤,我的建议是覆盖代理类对每个属性具有的委托字段.如果您从viewing generated proxy source上的博客文章中获取示例代码并使用RedGate的Reflector,您可以看到我正在谈论的字段.它们将是私有静态Func< [ProxyType],[PropertyType],[bool]>名称为ef_proxy_interceptorFor [PropertyName]的委托.返回值将确定getter是返回基类的属性值还是返回传递给委托的对象(前者为false,后者为true).