我有一个场景,我想在模型级别过滤一些实体集合,而不是在查询级别,即我基本上想要将过滤“硬编码”到我的模型中,以便我并不总是必须重复相同的Where方法在针对实体集的每个查询中进行过滤。更具体地说,我有一个CampaignTypes
实体集,在我忙于处理的数据模型中,我只希望属于某个业务领域的广告系列类型。没有较低级别的筛选我寻求,每次我查询CampaignTypes
我将不得不使用CampaignTypes.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor)
。我怎样才能避免重复过滤,创建数据库视图并在我的模型中使用它?在数据模型级别过滤实体集
回答
public IQueryable<CampaignType> getCampaignTypes()
{
using (var context = new TestEntities())
{
var campaignTypes = context.CampaignTypes.
Where(ct => ct.BusinessArea == BusinessAreas.Outdoor).
AsQueryable<CampaignTypes>();
return campaignTypes;
}
}
使用此方法的结果,而不是直接访问上下文。您也可以通过将“AsQueryable”方法更改为“AsList”等来修改您的查询以返回列表,设置等。
您可以在不需要担心过滤器和实体集的代码之间添加另一个图层(逻辑图层)。这个图层可以返回一个IQuerable或其他任何东西,它会将过滤器应用到实体集并返回结果。
通过这种方式,应用程序的其他部分不必担心应用此过滤器,它仍然是针对数据库执行的单个查询(对于大多数情况)。
是的,我经常在我的服务层完成此操作,但我只是好奇至于任何“更接近金属”的方法。 – ProfK 2010-12-15 19:57:08
可能有。我会避免更改生成的代码,因为只要您重新生成代码,它就会被覆盖。即使在我的简单应用程序中,我也有一个中间层,即使它只是一个精简的逻辑层,因为它通常在某个时间点需要。 – 2010-12-15 20:02:07
您可以在另一个文件中创建另一个名称不同的属性, 扩展了模型的主要部分类。
编辑:
namespace YourNameSpace
{
using System.Data.Objects;
public partial class SomeModelEntities
{
public ObjectSet<CampaignType> FilteredCampaignTypes
{
get
{
if ((_CampaignType == null))
{
_CampaignType = base.CreateObjectSet<CampaignType>("CampaignType");
}
return _CampaignType.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor);
}
}
}
}
我不确定你的意思是“用另一个文件中的不同名称复制它”,但我不想更改生成的代码,尤其是在早期开发中,因为我经常重新生成模型。 – ProfK 2010-12-15 19:56:01
- 1. 使用MVC3和ADO.NET实体数据模型过滤数据
- 2. 如何在实体框架模型中分片/过滤数据?
- 3. 在NHibernate中映射级别过滤实体
- 4. 过滤模型数据
- 5. 在数据库级别或应用程序级别上过滤数据
- 6. 实体数据模型System.ArgumentOutOfRangeException
- 7. 通过收集ID过滤实体LINQ
- 8. 实施模型过滤器
- 9. Backbonejs - 在模型中过滤集合
- 10. 过滤下拉大型数据集
- 11. 实体数据源过滤器
- 12. 从实体框架过滤数据
- 13. BreezeJS查询和过滤器通过实体集合实体
- 14. 在Backbone.js中实现Backbone.Subset.js以从父集合中过滤模型
- 15. SQL数据库,实体数据模型和1对1实体
- 16. 将实体数据模型实体作为JSON数据返回
- 17. 实体框架过滤器子集合
- 18. 按实体集合过滤。 Symfony2的
- 19. 在数据库级别或服务器/实例级别启用“CLR集成”吗?
- 20. 通过实体模型
- 21. 如何过滤模型中的数据?
- 22. 在SAS中通过另一个数据集过滤数据集
- 23. ORM:用于过滤实体上的懒惰集合的模式
- 24. 查找由集合中的相关实体过滤的实体
- 25. CoreData模型超级实体无属性
- 26. 过滤实体Linq
- 27. Django过滤器模型查询集
- 28. Backbone.js中的过滤模型(非收集)
- 29. NHibernate:如何根据鉴别器类型过滤映射集合
- 30. 数据集过滤方法
只是一个提示:我已经学会了在EF查询中不使用这种“使用”块。它妨碍了延迟加载,因为当客户端尝试访问尚未加载的导航属性时,EF可能会尝试加载它,并找到已经处理的上下文,并抛出一个粗鲁的异常。 – ProfK 2010-12-16 05:59:28
谢谢,ProfK。我很多使用延迟加载,所以没有意识到这一点。我今天晚上仔细看看(现在正在工作),并确定是否应该删除我的答案,或者修改它。 – 2010-12-16 20:54:55