检查OrderBy字符串是否有效

时间:2018-12-03 22:47:16

标签: c# linq sorting dynamic

var query = db.Customers
          .Where("City == @0 and Orders.Count >= @1", "London", 10)
          .OrderBy(someStringVariable)
          .Select("new(CompanyName as Name, Phone)");

在运行此查询之前,如何通过表达式检查someStringVariable是否为有效订单? 我想检查它而不是捕获ParseException。

  • 有效字符串:“城市ASC,电话DESC”
  • 无效的字符串不是DESC中存在的字段或类型错误:“ City1 DESC1”

在Anu的帮助下,我正在使用此函数,但我希望在Linq.Dynamic命名空间中使用一些“ TryParseQuery”。

    public static bool IsValidOrderString(Type type, string ordering)
    {
        if (string.IsNullOrWhiteSpace(ordering)) return false;

        var orderList = ordering.Trim().Split(',');
        var fields = type.GetProperties().Select(property => property.Name).ToArray();
        foreach (var orderItem in orderList)
        {
            var order = orderItem.TrimEnd();
            if (order.EndsWith(" ASC", StringComparison.InvariantCultureIgnoreCase) || order.EndsWith(" DESC", StringComparison.InvariantCultureIgnoreCase)) order = order.Substring(0, order.Length - 4);
            if (!fields.Contains(order.Trim())) return false;
        }

        return true;
    }

1 个答案:

答案 0 :(得分:2)

正如@mjwills指出的,

很难做到100%的可靠性,但是您可以做的一件事就是将'someStringVariable'与表中的列列表进行比较。您可以通过

找到列列表
.GetProperties().Select(property => property.Name).ToArray();

再次,您需要意识到这有很多陷阱。属性可以映射到与属性名称不同的列名称。