c# - 如何 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 库,但它不适用于这种情况;
我怎样才能做到这一点?
解决方案
我不完全确定是否可以在不设置UserNavigationPropsForSort
和Wallet
属性之间的映射的情况下完全动态地进行操作。
- 除非您想进入表达式树构建,否则我怀疑这对于您实际尝试做的事情来说太过分了。如果没有,请参阅此处的文档:https ://docs.microsoft.com/en-us/dotnet/csharp/expression-trees-building
我所做的是使您的代码更加简洁和可扩展:
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
开关。
请让我知道这是否是您的意思。
推荐阅读
- android - 有什么方法可以在不替换片段的情况下替换单个片段的数据?
- perl - 如何在 perl5 的格式语句中使用子例程参数?
- python - 给定一个带有空格的英文句子,我如何在 python 中估计特定单词适合该空格的概率?
- visual-studio - 在 Rider 中发布 Visual Studio 的数据库功能
- php - 显示带有两个标题的 PHP 数组中的 HTML 表
- r - 使用 R 在 for 循环中生成可重现的结果
- django - 如何创建特定的 django-model 字段,每天包含一个日期和唯一的数字?
- java - java main 方法无法编译,因为它找不到创建对象的符号
- ios13 - 我的应用程序如何知道它是否从小部件打开?
- postgresql - 我们可以在 Apache LDAP 和 Postgresql 中使用多个 ou(组织单位)吗