Ответы пользователя по тегу LINQ
  • Как написать собственный расширяющий метод linq для сущности?

    @Dmitriyq
    Дополню ответы методом сортировки по названию свойства
    public static IOrderedQueryable<TSource> OrderByAscOrDesc<TSource>(this IQueryable<TSource> query, string propName, bool isDesc)
    {
    	var entityType = typeof(TSource);
    	var propInfo = entityType.GetProperty(propName);
    	if (propInfo.DeclaringType != entityType)
    		propInfo = propInfo.DeclaringType.GetProperty(propName);
    
    	if (propInfo == null) return (IOrderedQueryable<TSource>)query;
    
    	var arg = Expression.Parameter(entityType, "x");
    	var property = Expression.MakeMemberAccess(arg, propInfo);
    	var selector = Expression.Lambda(property, new ParameterExpression[] { arg });
    
    	var methodName = isDesc ? "OrderByDescending" : "OrderBy";
    	var method = typeof(Queryable).GetMethods()
    		.Where(x => x.Name == methodName && x.IsGenericMethodDefinition)
    		.Where(x => x.GetParameters().Length == 2)
    		.Single();
    
    	var genericMethod = method.MakeGenericMethod(entityType, propInfo.PropertyType);
    	return (IOrderedQueryable<TSource>)genericMethod.Invoke(genericMethod, new object[] { query, selector });
    }
    Ответ написан
    Комментировать