2010-12-15 29 views
0

我有一个场景,我想在模型级别过滤一些实体集合,而不是在查询级别,即我基本上想要将过滤“硬编码”到我的模型中,以便我并不总是必须重复相同的Where方法在针对实体集的每个查询中进行过滤。更具体地说,我有一个CampaignTypes实体集,在我忙于处理的数据模型中,我只希望属于某个业务领域的广告系列类型。没有较低级别的筛选我寻求,每次我查询CampaignTypes我将不得不使用CampaignTypes.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor)。我怎样才能避免重复过滤,创建数据库视图并在我的模型中使用它?在数据模型级别过滤实体集

回答

0
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”等来修改您的查询以返回列表,设置等。

+0

只是一个提示:我已经学会了在EF查询中不使用这种“使用”块。它妨碍了延迟加载,因为当客户端尝试访问尚未加载的导航属性时,EF可能会尝试加载它,并找到已经处理的上下文,并抛出一个粗鲁的异常。 – ProfK 2010-12-16 05:59:28

+0

谢谢,ProfK。我很多使用延迟加载,所以没有意识到这一点。我今天晚上仔细看看(现在正在工作),并确定是否应该删除我的答案,或者修改它。 – 2010-12-16 20:54:55

1

您可以在不需要担心过滤器和实体集的代码之间添加另一个图层(逻辑图层)。这个图层可以返回一个IQuerable或其他任何东西,它会将过滤器应用到实体集并返回结果。

通过这种方式,应用程序的其他部分不必担心应用此过滤器,它仍然是针对数据库执行的单个查询(对于大多数情况)。

+0

是的,我经常在我的服务层完成此操作,但我只是好奇至于任何“更接近金属”的方法。 – ProfK 2010-12-15 19:57:08

+0

可能有。我会避免更改生成的代码,因为只要您重新生成代码,它就会被覆盖。即使在我的简单应用程序中,我也有一个中间层,即使它只是一个精简的逻辑层,因为它通常在某个时间点需要。 – 2010-12-15 20:02:07

1

您可以在另一个文件中创建另一个名称不同的属性, 扩展了模型的主要部分类。

编辑:

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); 
      } 
     } 
    } 
} 
+0

我不确定你的意思是“用另一个文件中的不同名称复制它”,但我不想更改生成的代码,尤其是在早期开发中,因为我经常重新生成模型。 – ProfK 2010-12-15 19:56:01