Building a Dynamic Predicate Based on Conditions

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

class Product
{
    public string Name { get; set; }
    public int Price { get; set; }
}

class Program
{
    static void Main()
    {
        var products = new List<Product>
        {
            new Product { Name = "Laptop", Price = 1000 },
            new Product { Name = "Phone", Price = 700 },
            new Product { Name = "Tablet", Price = 400 }
        };

        string propertyToCheck = "Price";
        int minPrice = 500;

        var parameter = Expression.Parameter(typeof(Product), "p");
        var property = Expression.Property(parameter, propertyToCheck);
        var constant = Expression.Constant(minPrice);
        var condition = Expression.GreaterThan(property, constant);

        var lambda = Expression.Lambda<Func<Product, bool>>(condition, parameter);

        var filteredProducts = products.AsQueryable().Where(lambda).ToList();

        foreach (var product in filteredProducts)
        {
            Console.WriteLine($"{product.Name}, ${product.Price}");
        }
    }
}