Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在实体框架中进行对象过滤?_C#_.net_Entity Framework - Fatal编程技术网

C# 如何在实体框架中进行对象过滤?

C# 如何在实体框架中进行对象过滤?,c#,.net,entity-framework,C#,.net,Entity Framework,定义对象上下文时,首先在实体框架中使用代码,例如: public class DomainContext : DbContext { public DomainContext() { } public virtual DbSet<News> News { get; set; } } 但是,问题是:有没有一种方法可以将预定义的筛选/条件应用于通过ctx.News的所有查询?假设我希望对ctx.News上的所有查询应用“今天发布”隐式过滤?您可以向上下文添加一个新属性:

定义对象上下文时,首先在实体框架中使用代码,例如:

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

但是,问题是:有没有一种方法可以将预定义的筛选/条件应用于通过
ctx.News
的所有查询?假设我希望对
ctx.News
上的所有查询应用“今天发布”隐式过滤?

您可以向上下文添加一个新属性:

public IEnumerable<News> TodaysNews
{
    get
    {
        return this.News.Where(x => x.PublishedDate == DateTime.Now.Date);
    }
}
public IEnumerable TodaysNews
{
得到
{
返回this.News.Where(x=>x.PublishedDate==DateTime.Now.Date);
}
}
任何进一步的过滤/排序等都可以应用于属性

更新:


如果不能仅使用预筛选查询,另一个选项是在数据库中创建一个视图,并将实体映射到该视图。视图可能基于当前日期。

我认为没有办法像您建议的那样向
DbSet
对象添加过滤器。但您应该能够做的是编写另一个函数:

public virtual IEnumerable<News> TodaysNews
{
    get { return News.WHere(n => n.PublishDate == DateTime.Today); } 
}
然后,当它将查询发送到服务器时,它将组合查询,而不是使其成为两个单独的查询。我不确定当您使用
IEnumerable
或需要返回其他内容(
IQueryable
)时这是否有效

编辑:


我刚看到你对下面另一张海报的反应。我想我打字/格式化花了太长时间。我不知道有什么方法可以应用这样的过滤器,但我们的解决方案是否能有效地做到这一点?您甚至可以让TodaysNews成为通过上下文或其他方式直接访问该对象的唯一方式。

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


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

我面临同样的问题,我发现了以下问题:。演示了如何使用它。

正确,但遗憾的是,这不是我想要的。是否无法将隐式查询筛选应用于EF中特定类型的所有对象?请参阅我的更新。使用实体映射到视图可能适合您的情况。为什么不添加一个属性NewsToday以返回“今日新闻”查询的结果?嗯,这是一种工作。但这有点复杂,我希望能够对应用程序的其余部分自动“隐藏”正常的“新闻”(这不是一个特定的应用程序,它是一个通用的解决方案,基本上可以作为一个库在公司范围内重复使用)。EntityFramework.Filters库在Filters值生命周期方面存在一些问题(请参阅问题部分)。EntityFramework.DynamicFilters()没有这些问题,但它需要将FK建模为实体类中的属性。
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;