日期:2014-05-20  浏览次数:20876 次

请教一个困扰很久的and or动态多条件组合查询的问题
C# code

    /// <summary>
    /// 产品价格范围条件
    /// </summary>
    public class PriceCondition
    {
        public string Name { get; set; }
        public float Min { get; set; }
        public float Max { get; set; }
    }

    public class Demo
    {
        public static void Main()
        {
            List<PriceCondition> conditions = new List<PriceCondition>();    //价格范围条件

            //添加条件
            conditions.Add(
                new PriceCondition()
                {
                    Name = "100元以下",
                    Min = 0,
                    Max = 100
                });

            conditions.Add(
                new PriceCondition()
                {
                    Name = "151~180元",
                    Min = 150,
                    Max = 180
                });

            conditions.Add(
                new PriceCondition()
                {
                    Name = "300元以上",
                    Min = 300,
                    Max = 0
                });

            Search(conditions, "关键字");
        }

        //最终想实现类似T-SQL效果: select * from Product where Name like '%关键字%' and ((price<=100) || (price>150 and price<=180) || (price>300))
        public List<Product> Search(List<PriceCondition> priceRange, string keywords)
        {
            var query = from p in Product.Table select p;
            if (!string.IsNullOrEmpty(keywords))
            {
                query = from p in query where p.Name.Contains(keywords) select p;
            }

            if (priceRange.Count > 0)
            {
                foreach (var price in priceRange)
                {
                    //这里该怎么写?
                }
            }

            return query.ToList();
        }
    }



------解决方案--------------------
C# code
using System;
using System.Collections.Generic;

namespace Test
{
    /// <summary>
    /// 产品价格范围条件
    /// </summary>
    public class PriceCondition
    {
        public string Name { get; set; }
        public float Min { get; set; }
        public float Max { get; set; }
    }

    public class Demo
    {
        public static void Main()
        {
            List<PriceCondition> conditions = new List<PriceCondition>();    //价格范围条件

            //添加条件
            conditions.Add(
                new PriceCondition()
                {
                    Name = "100元以下",
                    Min = 0,
                    Max = 100
                });

            conditions.Add(
                new PriceCondition()
                {
                    Name = "101~200元",
                    Min = 101,
                    Max = 200
                });

            conditions.Add(
                new PriceCondition()
                {
                    Name = "200元以上",
                    Min = 200,
                    Max = 0
                });

            Predicate<PriceCondition> macth = p => p.Name.Contains("1") && p.Max <= 33333;

            List<PriceCondition> list = Search(conditions, macth);
            foreach (PriceCondition price in list)
            {
                Console.WriteLine(price.Name);
            }

            Console.ReadKey();
        }

        //最终想实现类似T-SQL效果: select * from Product where Name like '%关键字%' and ((price<=100) || (price>100 and price<=200) || (price>200))
        public static List<PriceCondition> Search(List<PriceCondition> priceRange, Predicate<PriceCondition> macth)
        {
            return priceRange.FindAll(macth);
        }
    }
}

------解决方案--------------------
C# code