2011-05-16 24 views
5

当定义对象的背景下,实体框架首先使用的代码,例如:我们如何在Entity Framework中做对象过滤?

public class DomainContext : DbContext 
{ 
    public DomainContext() { } 
    public virtual DbSet<News> News { get; set; } 
} 

我们都知道,你可以查询“新闻报”做这样的事情(例如,吃出了今天发布的所有新闻):

var ctx = new DomainContext(); 
ctx.News.Where(x => x.PublishedDate == DateTime.Now.Date) 

但是,这是一个问题:是否有申请预先定义的过滤/条件穿过ctx.News所有查询的方法吗?假设我希望ctx.News上的所有查询具有隐式应用的“已发布的今日”过滤?

+0

为什么不添加一个属性NewsToday返回'今日新闻'查询的结果?例如:http://msdn.microsoft.com/en-us/library/bb882532.aspx – Fox32 2011-05-16 20:45:30

回答

0

你可以一个新的属性添加到您的上下文:

public IEnumerable<News> TodaysNews 
{ 
    get 
    { 
     return this.News.Where(x => x.PublishedDate == DateTime.Now.Date); 
    } 
} 

任何进一步的过滤/排序/等然后可以应用于属性。

更新:

如果你不能够仅仅使用预过滤查询,另一种选择是在数据库中创建一个视图你的实体映射到该视图。该视图可以基于当前日期。

+0

是正确的,但这不是我悲伤后的情况。是否没有办法将隐式查询过滤应用于EF内的特定类型的所有对象? – thr 2011-05-16 20:45:01

+0

查看我的更新。也许使用实体映射到视图会适合你的情况。 – Jacob 2011-05-16 21:04:13

2

我不相信有一种方法可以像您建议的那样向DbSet<News>对象添加过滤器。但是,你应该是什么能够做的仅仅是写另一个功能:

public virtual IEnumerable<News> TodaysNews 
{ 
    get { return News.WHere(n => n.PublishDate == DateTime.Today); } 
} 

然后,我想,如果你这样做对其他地方的顶部的查询,如:

var todaysGoodNews = from n in ctx.TodaysNews 
        where n.IsGood == true 
        select n; 

则将查询发送给服务器时将其组合在一起,而不是将它作为两个单独的查询。我不积极,如果这是有效的,当你使用IEnumerable<>或如果你需要返回其他东西(IQueryable<>,也许?)。

编辑:

我刚才看到下面的其他海报的响应。我想我花了太长时间来输入/格式。我不知道应用这样的过滤器的方法,但是我们的解决方案不是有效地做到这一点吗?你甚至可以让TodaysNews成为通过上下文或其他东西直接访问该对象的唯一方法。

+0

嗯,这样的工作。但是这样更复杂一些,我希望能够自动从应用程序的其余部分“隐藏”正常的“新闻”(这不是一个特定的应用程序,这是一个普遍的解决方案,是重新使用的公司基本上就像图书馆一样)。 – thr 2011-05-16 20:51:43

3

无法为查询新闻添加自动条件(过滤器)。所有发布的示例都有效,但前提是您直接查询News。例如,如果您加载的导航属性指向News,则示例将失败。

EDMX通过conditional mapping来解决这个问题,但这会导致其他非常糟糕的缺点。条件映射是固定的(不能在没有重建模型的情况下进行更改),并且每种类型只能有单一条件 - 就像TPH降级为单一实体类型。此外,条件映射中定义的条件可能无法与“今天”一起使用。条件映射在代码优先方法中不可用。

0

我面临同样的问题,我发现这个:EntityFramework.FiltersThis post显示如何使用它。

+0

EntityFramework.Filters库在过滤器值生命周期中存在一些问题(请参阅问题部分)。 EntityFramework.DynamicFilters(https://github.com/jcachat/EntityFramework.DynamicFilters)没有这些问题,但它需要将FKs建模为实体类中的属性。 – bloparod 2017-07-13 18:18:29

相关问题