【问题标题】:Check if OrderBy string is valid检查 OrderBy 字符串是否有效
【发布时间】:2019-05-05 07:10:38
【问题描述】:
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;
    }

【问题讨论】:

  • 简短的回答是你不能 100% 可靠地做到这一点。
  • 你能分享一些有效值和无效值的例子吗?

标签: c# linq sorting dynamic


【解决方案1】:

正如@mjwills 指出的那样,很难做到 100% 的可靠性,但您可以做的一件事是将 'someStringVariable' 与表中的列列表进行比较。您可以通过

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

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

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2017-01-20
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多