mvc inside example ejemplos c# linq entity-framework linq-to-entities entity-framework-6

c# - inside - iqueryable vs ienumerable



extender Donde para IQueryable (1)

Necesito extender el método Where para IQueryable a algo como esto:

.WhereEx("SomeProperty", "==", "value")

No sé si esto es posible, pero encontré esto en SO: no se puede ordenar con el nombre de la propiedad en LINQ OrderBy

Intenté esta respuesta y parece bastante interesante (respuesta de Ziad):

using System.Linq; using System.Linq.Expressions; using System; namespace SomeNameSpace { public static class SomeExtensionClass { public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending) { var param = Expression.Parameter(typeof(T), "p"); var prop = Expression.Property(param, SortField); var exp = Expression.Lambda(prop, param); string method = Ascending ? "OrderBy" : "OrderByDescending"; Type[] types = new Type[] { q.ElementType, exp.Body.Type }; var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp); return q.Provider.CreateQuery<T>(mce); } } }

¿Es posible hacer lo mismo con el método Where ?

Gracias.

Actualización :

Ahora puedo establecer una expresión para pasar al método Call , pero obtengo la siguiente excepción: "Ningún método genérico ''Where'' en el tipo ''System.Linq.Queryable'' es compatible con los argumentos y argumentos de tipo suministrados. se proporcionará si el método no es genérico ".

aquí está mi código:

public static IQueryable<T> WhereEx<T>(this IQueryable<T> q, string Field, string Operator, string Value) { var param = Expression.Parameter(typeof(T), "p"); var prop = Expression.Property(param, Field); var val = Expression.Constant(Value); var body = Expression.Equal(prop, val); var exp = Expression.Lambda<Func<T, bool>>(body, param); Type[] types = new Type[] { q.ElementType, typeof(bool) }; var mce = Expression.Call( typeof(Queryable), "Where", types, exp ); return q.Provider.CreateQuery<T>(mce); }

Tenga en cuenta que aún no utilizo el argumento Operator , en su lugar utilizo Equal para fines de depuración.

Alguien me puede ayudar con esto por favor ?


Hice otra publicación con una pregunta simplificada. el enlace está aquí

public static IQueryable<T> WhereEx<T>(this IQueryable<T> q, string Field, string Operator, string Value) { var param = Expression.Parameter(typeof(T), "p"); var prop = Expression.Property(param, Field); var val = Expression.Constant(Value); var body = Expression.Equal(prop, val); var exp = Expression.Lambda<Func<T, bool>>(body, param); return System.Linq.Queryable.Where(q, exp); }