2009-02-10 14 views
6

tengo una consulta como:Entidad marco dinámico donde Cláusula

var function = GetSomeExpression();  

using (FooModel context = new FooModel()) 
{ 
    var bar = context.Bar.Where(function); 
} 

Me gustaría hacer un método genérico que puede ejecutar Dónde contra diferentes entidades en el contexto. El objetivo es no tener que hacer context.Bar.Where, context.Car.Where, Context.Far.Where, etc.

Algo que no se puede hacer, pero ilustra el objetivo es:

var q = context.GetObjectContext(T).Where(queryFunction); 

He analizado el uso de Relfection y puedo obtener el método Where, pero no sé cómo ejecutarlo en el contexto que pasa en el delegado. También miré DynamicMethod, pero hacer todo el trabajo de IL no me gusta.

Lo que tengo hasta ahora:

private List<T> GetResults<T>(Expression<Func<T, bool>> queryFunction) 
{ 
    // note: first() is for prototype, should compare param type 
    MethodInfo whereMethod = typeof(Queryable).GetMethods() 
     .Where(m => m.Name == "Where") 
     .First().MakeGenericMethod(typeof(T)); 

    // invoke the method and return the results 
    List<T> result = whereMethod.Invoke(
    // have the method info 
    // have the expression 
    // can reference the context 
    ); 

    throw new NotImplementedException(); 
} 

Es esto posible hacerlo?

+0

Había intentado hacer esto un tiempo atrás y terminó la construcción de un repositorio para cada uno. Me gustaría saber qué piensan los demás. El designer.cs genera un ctx.CreateQuery ("[Bar]"); – bendewey

Respuesta

7

Ésta es la manera más fácil que lo que estaba tratando antes:

private List<T> GetResults<T>(IQueryable<T> source, 
    Expression<Func<T, bool>> queryFunction) 
{ 
    return source.Where(queryFunction).ToList<T>(); 
}