欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[C#] Linq 动态条件查询

程序员文章站 2022-07-04 16:23:15
...

应用背景:以货品为例,在基础数据中配置货品的判断规则,要根据这个规则筛选出符合条件的集合。

创建货品类

    public class Product
    {
        public string Name { get; set; }
        public string Code { get; set; }
        public string Unit { get; set; }
    }

主要实现方法

        public void GetProducts()
        {
            #region 创建List 实际应用从数据库中取值
            var products = new[] {
                new {Name = "货品1", Code = "001", Unit = "个"},
                new {Name = "货品2", Code = "002", Unit = "件"},
                new {Name = "货品3", Code = "003", Unit = "瓶"},
                new {Name = "货品4", Code = "004", Unit = "个"},
                new {Name = "货品1", Code = "005", Unit = "台"},
            };
            List<Product> lsProducts = new List<Product>();
            foreach (var q in products)
            {
                Product product = new Product();
                product.Name = q.Name;
                product.Code = q.Code;
                product.Unit = q.Unit;
                lsProducts.Add(product);
            }
            #endregion
            //获取到的判断规则 判断规则为Code和Unit 其中Name为固定条件
            string condition = "Code,Unit";
            string[] arrayCondition = condition.Split(',');
            //查询结果
            List<Product> result = lsProducts.Where(a => Filter(a, arrayCondition, "货品1", "005", "")).ToList(); //0条
            //只需判断Code 其中Name为固定条件
            string condition2 = "Code";
            arrayCondition = condition2.Split(',');
            result = lsProducts.Where(a => Filter(a, arrayCondition, "货品1", "005", "")).ToList();//1条
            //没有判断规则 其中Name为固定条件
            string condition3 = "";
            arrayCondition = condition3.Split(',');
            result = lsProducts.Where(a => Filter(a, arrayCondition, "货品1", "005", "")).ToList();//2条
        }

        public bool Filter(Product product, string[] arrayCondition, string name, string code, string unti)
        {
            bool result = false;
            result = (product.Name == name)
                && (!arrayCondition.Contains("Code") ? true : product.Code == code)
                && (!arrayCondition.Contains("Unit") ? true : product.Unit == unti);
            return result;
        }