Проверьте правильность строки OrderBy - PullRequest
0 голосов
/ 04 декабря 2018
var query = db.Customers
          .Where("City == @0 and Orders.Count >= @1", "London", 10)
          .OrderBy(someStringVariable)
          .Select("new(CompanyName as Name, Phone)");

Как я могу проверить, является ли someStringVariable действительным порядком заказа по выражению, прежде чем выполнять этот запрос?Я хочу проверить его вместо перехвата ParseException.

  • Допустимая строка: "City ASC, Phone DESC"
  • Недопустимая строка - это не существующее поле или опечатка в DESC: "City1 DESC1"

С помощью Anu я использую эту функцию, но я бы предпочел использовать «TryParseQuery» в пространстве имен Linq.Dynamic.

    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 голосов
/ 04 декабря 2018

, как указал @mjwills, это трудно сделать со 100% -ной надежностью, но одну вещь, которую вы могли бы сделать, - сравнить 'someStringVariable' со списком столбцов в вашей таблице.Вы можете найти список столбцов через

.GetProperties().Select(property => property.Name).ToArray();

Опять же, вы должны знать, что это имеет много подводных камней.Свойства могут быть сопоставлены с именами столбцов, которые не совпадают с именами свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...