2011-05-16 38 views
5

Al definir un contexto del objeto, utilizando el código por primera vez en marco de la entidad, por ejemplo:¿Cómo podemos hacer el filtrado de objetos en Entity Framework?

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

Todos sabemos que se puede consultar "Noticias" hacer algo así (por ejemplo, para obtener todas las noticias que se han publicado hoy):

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

Pero, y esta es la pregunta: ¿hay una manera de aplicar un filtrado/condición pre-definido a todas las consultas que pasan por ctx.News? Digamos que quería que todas las consultas en ctx.News tuvieran el filtrado "Publicado hoy" implícito aplicado?

+0

¿Por qué no agregar una propiedad NewsToday que devuelve el resultado de una consulta de "noticias de hoy"? Ejemplo: http://msdn.microsoft.com/en-us/library/bb882532.aspx – Fox32

Respuesta

0

Se podría añadir una nueva propiedad a su contexto:

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

ningún tipo de filtrado más/clasificación/etc puede entonces ser aplicado a la propiedad.

Actualización:

Si usted no es capaz de simplemente utilizar una consulta pre-filtrada, otra opción es crear una vista en su base de datos y el mapa de su entidad a esa vista. La vista podría estar basada en la fecha actual.

+0

Correcto, pero eso no es lo que busco tristemente. ¿No hay forma de aplicar un filtrado de consulta implícita a todos los objetos de un tipo específico dentro de EF? – thr

+0

Ver mi actualización. Tal vez usar el mapeo de entidades a una vista funcionaría para su situación. – Jacob

2

No creo que haya una manera de agregar un filtro al objeto DbSet<News> como lo sugiere. Pero lo que debería ser capaz de hacer es escribir otra función:

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

Y luego, creo que, si se hizo una consulta por encima de eso en otro lugar, como:

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

entonces combinaría las consultas cuando las envió al servidor en lugar de convertirlas en dos consultas separadas. No estoy seguro si eso funciona cuando usa IEnumerable<> o si necesita devolver algo más (IQueryable<>, ¿quizás?).

Editar:

Acabo de ver su respuesta al otro cartel a continuación. Supongo que tardé mucho en escribir/formatear. No sé de ninguna manera para aplicar un filtro como ese, pero ¿no son nuestras soluciones las que efectivamente lo hacen? Incluso podría hacer que TodaysNews sea la única forma de acceder directamente a ese objeto a través del contexto o algo así.

+0

Bueno, es una especie de trabajo. Pero es un poco más complicado que eso, quiero ser capaz de "ocultar" las "noticias" normales del resto de la aplicación automáticamente (esta no es una aplicación específica, es una solución general que se reutilizará). de ancho como una biblioteca básicamente). – thr

3

No hay forma de agregar una condición automática (filtro) a las noticias de consulta. Todos los ejemplos publicados funcionan pero solo si consulta News directamente. Si, por ejemplo, cargas la propiedad de navegación que apunta a News, los ejemplos fallarán.

EDMX resuelve esto por conditional mapping pero esto lleva a otras desventajas muy malas. El mapeo condicional es fijo (no se puede cambiar sin reconstruir el modelo) y puede tener una sola condición para cada tipo; es como TPH degradada a un solo tipo de entidad. Además, las condiciones definidas en el mapeo condicional probablemente no pueden funcionar con "Hoy". La asignación condicional no está disponible en el enfoque de primer código.

0

Estoy enfrentando el mismo problema y encontré esto: EntityFramework.Filters. This post muestra cómo usarlo.

+0

La biblioteca EntityFramework.Filters tiene algunos problemas con el ciclo de vida de los valores de los filtros (consulte la sección de problemas). EntityFramework.DynamicFilters (https://github.com/jcachat/EntityFramework.DynamicFilters) no tiene estos problemas, pero requiere modelar los FK como propiedades en las clases de entidad. – bloparod

Cuestiones relacionadas