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