Le espressioni lambda (quelle utilizzate in Dove, OrderBy ecc.) Non possono contenere alcun codice specifico C#, possono contenere solo albero di espressioni, che viene tradotto in SQL. Non è possibile chiamare lì metodi arbitrari, ad eccezione di quelli citati dalla documentazione EF come SqlFunctions ecc.
Per eseguire l'ordinamento con un nome di campo in fase di esecuzione, è necessario creare un'espressione lambda in fase di esecuzione e passarla sopra.
public IEnumerable<TModel> Paginate(IQueryable<TModel> source, ref int totalPages, int pageIndex, int pageSize, string sortfield, SortDirection? sortdir)
{
totalPages = (int)Math.Ceiling(source.Count()/(double)pageSize);
if (sortdir == SortDirection.Descending)
{
return source.OrderByDescending(sortfield).Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
else
{
return source.OrderBy(sortfield).Skip(pageIndex * pageSize).Take(pageSize).ToList();
}
}
public static class QueryableHelper
{
public static IQueryable<TModel> OrderBy<TModel>(this IQueryable<TModel> q, string name)
{
Type entityType = typeof(TModel);
PropertyInfo p = entityType.GetProperty(name);
MethodInfo m = typeof(QueryableHelper).GetMethod("OrderByProperty").MakeGenericMethod(entityType, p.PropertyType);
return(IQueryable<TModel>) m.Invoke(null, new object[] { q, p });
}
public static IQueryable<TModel> OrderByDescending<TModel>(this IQueryable<TModel> q, string name)
{
Type entityType = typeof(TModel);
PropertyInfo p = entityType.GetProperty(name);
MethodInfo m = typeof(QueryableHelper).GetMethod("OrderByPropertyDescending").MakeGenericMethod(entityType, p.PropertyType);
return (IQueryable<TModel>)m.Invoke(null, new object[] { q, p });
}
public static IQueryable<TModel> OrderByPropertyDescending<TModel, TRet>(IQueryable<TModel> q, PropertyInfo p)
{
ParameterExpression pe = Expression.Parameter(typeof(TModel));
Expression se = Expression.Convert(Expression.Property(pe, p), typeof(object));
return q.OrderByDescending(Expression.Lambda<Func<TModel, TRet>>(se, pe));
}
public static IQueryable<TModel> OrderByProperty<TModel, TRet>(IQueryable<TModel> q, PropertyInfo p)
{
ParameterExpression pe = Expression.Parameter(typeof(TModel));
Expression se = Expression.Convert(Expression.Property(pe, p), typeof(object));
return q.OrderBy(Expression.Lambda<Func<TModel, TRet>>(se, pe));
}
}
Questa soluzione funziona solo su unico livello di proprietà, ma se si desidera che i livelli nidificati che ha bisogno di più lavoro, forse si può guardare dopo SDK, che fa tutto questo.
Tuttavia, se si dà un'occhiata a Entity REST SDK stesso, ha molte cose e tutte le cose che potrebbero essere necessarie. Disclaimer: I am the Author.
https://entityrestsdk.codeplex.com
cosa/dove esattamente sia il problema che stanno ottenendo? Sembra che il tuo ottenere un percorso non tutti restituisca un valore? – Sayse
Ricevo un "LINQ su Entità che non riconosce il metodo Metodo metodo nome", in particolare il metodo "GetPropertyValue". –