Linq Dynamic Query OrderBy со свойством навигации - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть этот метод ниже для построения динамического запроса linq с разбиением на страницы и сортировкой.Но когда отправка для сортировки по свойству, которое имеет отношение к другой сущности, такой как Entity Product, имеет отношение к Customer и вызывает метод для получения Customer и в «includeProperties» отправляет Product, и я хочу сортировать по «Product.Name».это не сработало

Метод:

public virtual IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
            string includeProperties = "", int page = 0, int pagesize = 100, string sortColumn = "", string sortColumnDir = "")
        {
            IQueryable<TEntity> query = dbSet;

            if (filter != null)
            {
                query = query.Where(filter);
            }

            foreach (var includeProperty in includeProperties.Split
                (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }

            if (sortColumn != string.Empty && sortColumn.IndexOf(".") <= 0)
            {
                ParameterExpression[] typeParams = new ParameterExpression[] {
                    Expression.Parameter(typeof(TEntity), "")
                };

                System.Reflection.PropertyInfo pi = typeof(TEntity).GetProperty(sortColumn);

                sortColumnDir = sortColumnDir == "asc" ? "OrderBy" : "OrderByDescending";

                query = (IOrderedQueryable<TEntity>)query.Provider.CreateQuery(
                    Expression.Call(
                        typeof(Queryable),
                        sortColumnDir,
                        new Type[] { typeof(TEntity), pi.PropertyType },
                        query.Expression,
                        Expression.Lambda(Expression.Property(typeParams[0], pi), typeParams))
                );
            }
            else if (orderBy != null)
            {
                query = orderBy(query);
            }
            else
            {
                query = query.OrderBy(obj => obj.Desativado);
            }

            query = query.Skip(page * pagesize).Take(pagesize);

            return query.ToList();
        }

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 26 сентября 2018

Что делает ваш метод построения запросов, когда вы передаете что-то вроде "X.Y" в параметре sortColumn?

Сначала он пытается

if (sortColumn != string.Empty && sortColumn.IndexOf(".") <= 0)

Условие оценивается как ложное, когда выиметь точку в sortColumn.Так что эта ветвь пропущена.

Затем наступает

else if (orderBy != null)

Это снова не удар, вы не указали orderBy, а аргумент sortColumn.

Итак, в конце концов вы получите

else
{
    query = query.OrderBy(obj => obj.Desativado);
}

И это, очевидно, далеко от того, чего вы хотели достичь, так как он не будет сортироваться по X.Y.

Что делатьтогда?У вас есть опции:

  1. Вы определяете сортировку, используя обратный вызов вместо строки пути:

    ProductRepository.Get(p => p.Name == "X", includeProperties: "Item", orderBy: query => query.OrderBy(product => product.Item.Codigo))
    
  2. Вы изменяете метод построителя запросов так, чтобычто он принимает путь свойства в sortColumn.Однако для этого потребуется больше усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...