gpt4 book ai didi

c# - 如何在规范中生成动态数量的 ThenBy 子句

转载 作者:太空宇宙 更新时间:2023-11-03 20:52:16 26 4
gpt4 key购买 nike

我正在构建一个 Spec Evaluator,它必须考虑多个可能的 OrderBy,如下例所示:

if (spec.Order != null)
{
var count = spec.Order.Count;

if (count == 1)
{
query = query.OrderBy(spec.Order[0]);
}
else if (count == 2)
{
query = query.OrderBy(spec.Order[0])
.ThenBy(spec.Order[1]);
}
else if (count == 3)
{
query = query.OrderBy(spec.Order[0])
.ThenBy(spec.Order[1])
.ThenBy(spec.Order[2]);
}
// And so on...
}

Query是一个 IQueryable , spec.Order是子句列表:List<Expression<Func<T, object>>> .

我知道我可以使用 OrderBy,所有子句都作为字符串传递。我想我可以投影所有 Order新字符串的子句以逗号分隔。但该解决方案似乎并不干净。

有没有其他方法可以动态生成一个新的ThenBy对于 Order 的每一项列表,大于 1?

最佳答案

你可以使用 for环形。基本上遍历所有 Order值,使用 OrderBy对于第一个,ThenBy对于后续项目。既然你说过你正在使用 IQueryable ,我修改了它以使用临时 IOrderedQueryable<T>变量。

if (spec.Order != null)
{
var count = spec.Order.Count;

IOrderedQueryable<T> orderedQuery = null;
for (int i = 0; i < count; ++i)
{
if (i == 0)
{
orderedQuery = query.OrderBy(spec.Order[i]);
}
else
{
orderedQuery = orderedQuery.ThenBy(spec.Order[i]);
}
}
query = orderedQuery ?? query;
}

你也可以这样处理,虽然我不确定这两种方法的性能有何不同,如果有的话:

if (spec.Order != null)
{
var count = spec.Order.Count;

for (int i = 0; i < count; ++i)
{
if (query is IOrderedQueryable<T> orderedQuery)
{
query = orderedQuery.ThenBy(spec.Order[i]);
}
else
{
query = query.OrderBy(spec.Order[i]);
}
}
}

关于c# - 如何在规范中生成动态数量的 ThenBy 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com