【问题标题】:How to generate a dynamic number of ThenBy clauses in a Specification如何在规范中生成动态数量的 ThenBy 子句
【发布时间】:2019-01-10 12:18:52
【问题描述】:

我正在构建一个 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 子句投影到一个以逗号分隔的新字符串。但该解决方案似乎并不干净。

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

【问题讨论】:

  • spec.Order 的类型到底是什么?
  • @Dai 是子句列表List<Expression<Func<T, object>>>
  • 你为什么不创建一个扩展方法并链接你的调用:stackoverflow.com/questions/13497255/…
  • @PraneetNadkar 我正在寻找完全相反的情况,这就是我使用规范模式的原因。

标签: c# linq


【解决方案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]);
        }
    }
}

【讨论】:

  • 是的,这是我的第一次尝试,但没有成功。 Query 是 IQueryable。 ThenBy 期待和 IOrderedQueryable 所以我不能只是加入他们,也不能投他们。
  • @Erre 你能把这些信息添加到你的问题中吗?
  • @Erre 这个呢?
猜你喜欢
  • 2016-05-28
  • 2017-05-27
  • 1970-01-01
  • 2021-05-27
  • 2012-06-07
  • 2011-08-22
  • 1970-01-01
  • 2019-08-20
  • 2011-03-27
相关资源
最近更新 更多