Après une recherche en ligne et en passant par les anciens postes de stackoverflow pour une mise en œuvre appropriée pour la commande dynamique avec linq, je suis venu avec ma propre mise en œuvre borrows a few things d'autres solutions que j'ai vu précédemment.Est-ce que cette méthode LINQ dynamic orderby est sûre?
Ce que je dois savoir est si cette implémentation est threadsafe? Je ne crois pas que je passe un objet de type générique énumérable (type de référence) en tant que paramètre dans la méthode statique mais je voudrais savoir si je manque quelque chose d'autre et j'espère comment le rendre complètement sécurisé.
public class OrderByHelper
{
public static IEnumerable<T> OrderBy<T>(IQueryable<T> items, string sortColumn, string sortDirection, int pageNumber, int pageSize)
{
Type t = typeof(T).GetProperty(sortColumn).PropertyType;
return (IEnumerable<T>)(typeof(OrderByHelper)
.GetMethod("OrderByKnownType")
.MakeGenericMethod(new[] { typeof(T), t })
.Invoke(null, new object[] { items, sortColumn, sortDirection, pageNumber, pageSize }));
}
public static IEnumerable<K> OrderByKnownType<K, T>(IQueryable<K> items, string sortColumn, string sortDirection, int pageNumber, int pageSize)
{
var param = Expression.Parameter(typeof(K), "i");
var mySortExpression = Expression.Lambda<Func<K, T>>(Expression.Property(param, sortColumn), param);
if (!string.IsNullOrEmpty(sortDirection))
{
if (sortDirection == "ASC")
return items.OrderBy(mySortExpression).Skip((pageNumber - 1) * pageSize).Take(pageSize);
else
return items.OrderByDescending(mySortExpression).Skip((pageNumber - 1) * pageSize).Take(pageSize);
}
else
throw new InvalidOperationException("No sorting direction specified.");
}
}