在数据模型级别过滤实体集

时间:2010-12-15 19:21:50

标签: .net entity-framework entity-framework-4

我有一个场景,我想在模型级别过滤一些实体集,而不是在查询级别,即我基本上想要“硬编码”过滤到我的模型中,这样我就不必总是重复在每个查询中针对实体集的Where方法过滤。更具体地说,我有一个CampaignTypes实体集,在数据模型中我很忙,我只想要属于某个业务领域的广告系列类型。如果没有我搜索的低级过滤,每次查询CampaignTypes时,我都必须使用CampaignTypes.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor)。如何避免重复过滤而不是创建数据库视图并在我的模型中使用它?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);
            }
        }
    }
}

答案 2 :(得分: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”等来修改查询以返回列表,集合等。