代码之家  ›  专栏  ›  技术社区  ›  Erre Efe

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

  •  1
  • Erre Efe  · 技术社区  · 6 年前

    我正在构建一个规范评估器,它必须考虑多个可能的Orror,如下一个例子:

    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 顺序 列表,高于1?

    1 回复  |  直到 6 年前
        1
  •  4
  •   ProgrammingLlama Raveena Sarda    6 年前

    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]);
            }
        }
    }