Предикат с динамическим выражением.ParseLambda

#c#

#c#

Вопрос:

Я создаю динамическую фильтрацию по списку. Я получу предикат из пользовательского интерфейса (например, «Name == «Australia»»), и код должен отфильтровать список. Он отлично работает для оператора «==». Однако я борюсь с приведенными ниже условиями и не уверен, как пользовательский интерфейс передаст приведенные ниже условия в предикате.

  1. Содержит
  2. Начинается с
  3. Завершается
  4. Не равно
  5. Больше, чем
  6. Меньше, чем
  7. Между

Я скопировал свой исходный код ниже. Помощь здесь была бы признательна.

 class Program
    {
        static void Main(string[] args)
        {
            var lst = new List<Myclass>();

            lst.Add(new Myclass { Name = "Australia", Id = 1, Dt = System.DateTime.Now.AddDays(10) });
            lst.Add(new Myclass { Name = "USA", Id = 2, Dt = System.DateTime.Now.AddDays(5) });
            lst.Add(new Myclass { Name = "India", Id = 3, Dt = System.DateTime.Now});

            var result = lst.AsQueryable().Where(DynamicExpression.ParseLambda<Myclass, bool>("Name == "Australia""));
            var r = result.ToList();

        }
    }

    public class Myclass
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Dt { get; set; }
    }
 

Я думаю, что нашел предикат, который мне нужен.

 Text Field Equal To = string exp = "(Name ="India")";
Text Field NOT Equal To = string exp = "(Name !="India")";
Text Field Contains = string exp = "(Name.Contains ("Ind"))";
Text Field Starts With = string exp = "(Name.StartsWith ("Ind"))";
Text Field Ends With = string exp = "(Name.EndsWith ("a"))";

Number Field Equal to = string exp = "(Id = 1)";
Number Field Between with multiple conditions = string exp = "(Id > 1 AND Id <= 3) OR Id =3";
Number Field Between and greater than equal to = string exp = "(Id > 1 AND Id >= 3)";

Date Field Between  = string exp = "(Dt > Convert.ToDateTime("2/5/2021 4:46:04 AM") AND Dt >= Convert.ToDateTime("2/3/2021 4:46:04 AM"))";
 

Комментарии:

1. «Однако я борюсь с нижеприведенными условиями» — что вы пробовали и что получилось?

2. Я пробовал использовать предикат «Name Like «%Australia%»», но он выдает исключение.. Я не уверен, как написать предикат для like.

3. Какое исключение он выдает? Какой тип исключения и сообщение?

4. Этот вопрос можно закрыть, поскольку я нашел решение своей проблемы. Я обновил свой вопрос ответом.

5. @Machindra Не стесняйтесь публиковать его как фактический ответ ниже — ответ на ваш собственный вопрос также означает, что вы можете принять ответ (вы получаете rep вопрос больше не указан как «без ответа»)

Ответ №1:

Я думаю, что нашел предикат, который мне нужен.

 Text Field Equal To = string exp = "(Name ="India")";
Text Field NOT Equal To = string exp = "(Name !="India")";
Text Field Contains = string exp = "(Name.Contains ("Ind"))";
Text Field Starts With = string exp = "(Name.StartsWith ("Ind"))";
Text Field Ends With = string exp = "(Name.EndsWith ("a"))";

Number Field Equal to = string exp = "(Id = 1)";
Number Field Between with multiple conditions = string exp = "(Id > 1 AND Id <= 3) OR Id =3";
Number Field Between and greater than equal to = string exp = "(Id > 1 AND Id >= 3)";

Date Field Between  = string exp = "(Dt > Convert.ToDateTime("2/5/2021 4:46:04 AM") AND Dt >= Convert.ToDateTime("2/3/2021 4:46:04 AM"))";