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库,但它不适用于这种情况;
我该怎么做?
发布于 2021-09-09 22:23:35
信贷@nbokman和@Svyatoslav Danyliv。我用表达式代替Func,现在使用代码工作。
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);
}
}发布于 2021-09-09 19:11:22
我不能完全确定在不设置UserNavigationPropsForSort和Wallet属性之间的映射的情况下完全动态地完成它。
我所做的是使您的代码更加简洁和可扩展:
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开关。
如果这是你的意思请告诉我。
https://stackoverflow.com/questions/69122222
复制相似问题