首页 > 解决方案 > 如何 orderBy 动态地,基于导航属性

问题描述

var query = TableNoTracking;
query = query
            .Include(r => r.UserRoles).ThenInclude(o => o.Role)
            .Include(c => c.Photos.Where(x => x.IsMain))
            .Include(w => w.Wallets);

我的排序部分如下所示,我想动态处理排序

   if (!string.IsNullOrWhiteSpace(filterUser.SortBy))
            {
                switch (filterUser.Reverse)
                {
                    //reverse
                    case true:
                        switch (filterUser.SortBy)
                        {
                            case UserNavigationPropsForSort.InventorySum:
                                query = query.OrderByDescending(x => x.Wallets.Select(y => y.Inventory).Sum());
                                break;
                            case UserNavigationPropsForSort.InterMoneySum:
                                query = query.OrderByDescending(x => x.Wallets.Select(y => y.InterMoney).Sum());
                                break;
                            case UserNavigationPropsForSort.ExitMoneySum:
                                query = query.OrderByDescending(x => x.Wallets.Select(y => y.ExitMoney).Sum());
                                break;
                            case UserNavigationPropsForSort.OnExitMoneySum:
                                query = query.OrderByDescending(x => x.Wallets.Select(y => y.OnExitMoney).Sum());
                                break;
                        }

                        break;
                    case false:
                        switch (filterUser.SortBy)
                        {
                            case UserNavigationPropsForSort.InventorySum:
                                query = query.OrderBy(x => x.Wallets.Select(y => y.Inventory).Sum());
                                break;
                            case UserNavigationPropsForSort.InterMoneySum:
                                query = query.OrderBy(x => x.Wallets.Select(y => y.InterMoney).Sum());
                                break;
                            case UserNavigationPropsForSort.ExitMoneySum:
                                query = query.OrderBy(x => x.Wallets.Select(y => y.ExitMoney).Sum());
                                break;
                            case UserNavigationPropsForSort.OnExitMoneySum:
                                query = query.OrderBy(x => x.Wallets.Select(y => y.OnExitMoney).Sum());
                                break;
                        }
                        break;
                }
            }

我包含了几个实体,现在我想根据包含的属性动态订购此查询,例如钱包中的库存。我尝试了动态 linq 库,但它不适用于这种情况;

我怎样才能做到这一点?

标签: c#.netlinqentity-framework-core

解决方案


我不完全确定是否可以在不设置UserNavigationPropsForSortWallet属性之间的映射的情况下完全动态地进行操作。

我所做的是使您的代码更加简洁和可扩展:

            var query = TableNoTracking;
            query = query
                .Include(r => r.UserRoles).ThenInclude(o => o.Role)
                .Include(c => c.Photos.Where(x => x.IsMain))
                .Include(w => w.Wallets);
            
            if (!string.IsNullOrWhiteSpace(filterUser.SortBy.ToString()))
            {
                Func<Wallet, decimal> sortByToProperty = filterUser.SortBy switch
                {
                    UserNavigationPropsForSort.InventorySum => w => w.Inventory,
                    UserNavigationPropsForSort.InterMoneySum => w => w.InterMoney,
                    UserNavigationPropsForSort.ExitMoneySum => w => w.ExitMoney,
                    UserNavigationPropsForSort.OnExitMoneySum => w => w.OnExitMoney,
                    _ => throw new ArgumentOutOfRangeException()
                };

                query = filterUser.Reverse
                    ? query.OrderByDescending(x => x.Wallets.Select(sortByToProperty).Sum())
                    : query.OrderBy(x => x.Wallets.Select(sortByToProperty).Sum());
            }

如果在任何时候,您想添加更多属性进行排序,您可以展开sortByToProperty开关。

请让我知道这是否是您的意思。


推荐阅读