首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于导航属性的orderBy动态实现方法

基于导航属性的orderBy动态实现方法
EN

Stack Overflow用户
提问于 2021-09-09 17:06:58
回答 2查看 128关注 0票数 0
代码语言:javascript
复制
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);

我的排序部分如下所示,我需要动态处理排序。

代码语言:javascript
复制
   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库,但它不适用于这种情况;

我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-09 22:23:35

信贷@nbokman和@Svyatoslav Danyliv。我用表达式代替Func,现在使用代码工作。

代码语言:javascript
复制
        if (!string.IsNullOrWhiteSpace(filterUser.SortBy))
            {
                if (filterUser.SortableProperties.Any(x =>
                    string.Equals(x, filterUser.SortBy, StringComparison.CurrentCultureIgnoreCase)))
                {
                    Expression<Func<User, int>> exp = filterUser.SortBy switch
                    {
                        UserNavigationPropsForSort.InventorySum => w => w.Wallets.Select(x => x.Inventory).Sum(),
                        UserNavigationPropsForSort.InterMoneySum => w => w.Wallets.Select(x => x.InterMoney).Sum(),
                        UserNavigationPropsForSort.ExitMoneySum => w => w.Wallets.Select(x => x.ExitMoney).Sum(),
                        UserNavigationPropsForSort.OnExitMoneySum => w => w.Wallets.Select(x => x.OnExitMoney).Sum(),
                        _ => throw new ArgumentOutOfRangeException()
                    };

                    query = filterUser.Reverse ? query.OrderByDescending(exp) : query.OrderBy(exp);
                }
            }
票数 1
EN

Stack Overflow用户

发布于 2021-09-09 19:11:22

我不能完全确定在不设置UserNavigationPropsForSortWallet属性之间的映射的情况下完全动态地完成它。

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

代码语言:javascript
复制
            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开关。

如果这是你的意思请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69122222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档