EF中一种简单的多条件动态查询方法

本文介绍了在Entity Framework(EF)中实现多条件动态查询的一种简单方法,避免了动态生成委托的复杂性。通过动态组装查询计划,可以根据用户输入灵活地进行不同数量条件的查询操作。

       多条件动态查询是任何一个数据系统都会处理的问题。如果使用纯SQL和数据库进行交互,可以使用SQLHepler之类的工具根据用户输入来动态生成SQL语句。在EF框架下进行多条件动态查询,有各种不同的方法。最近看了和尚兄的代码,简单易懂,值得学习。其基本思想就是动态的组装查询计划,避开动态生成委托的复杂性。
        数据模型类:

   class Person
    {
        public string Name;
        public int Age;
        public float Weight;
        public string Hobby;
    }
          在构造函数中初始化数据:
        private List<Person> m_DataSourc;
        //构造函数中初始化演示数据源
        public Demo1()
        {
            m_DataSourc = new List<Person>
            {
                new Person{Name="熊大", Age=31,Weight=125,Hobby="吃饭"},
               new Person{Name="熊二", Age=30,Weight=120,Hobby="睡觉"},
                new Person{Name="光头强", Age=28,Weight=70,Hobby="砍树"},
                  new Person{Name="喜羊羊", Age=12,Weight=20,Hobby="自拍"},
                  new Person{Name="美羊羊", Age=13,Weight=21,Hobby="自拍"},
                  new Person{Name="懒羊羊", Age=14,Weight=22,Hobby="睡觉"},
                   new Person{Name="灰太狼", Age=30,Weight=60,Hobby="抓羊"}
            };
        }
         构造一个查询方法,以四个参数进行查询,由于参数可能不存在,均为默认参数。
        //查询方法
        public void Search(string name = null, int? age = null, float? weight = null, string hobby = null)
        {
            //为了模拟EF查询,转换为IEnumerable,在EF中此处为数据库上下文的表对象
            var result = (IEnumerable<Person>)m_DataSourc;

            /*下列代码不会立即执行查询,而是生成查询计划
             * 若参数不存在则不添加查询条件,从而可以无限制的添加查询条件
             */
            if (!string.IsNullOrEmpty(name)) { result = result.Where(d => d.Name.Contains(name)); }            
            if (age.HasValue) { result = result.Where(d =>d.Age >= age); }
            if (weight.HasValue) { result = result.Where(d => d.Weight >= weight); }
            if (!string.IsNullOrEmpty(hobby)) { result = result.Where(d => d.Hobby.Contains(hobby)); }

            //此时执行查询
            var final = result.ToList();
            Console.WriteLine("");
            Console.WriteLine("*******开始结束*******");
            foreach (var i in final)
            {
                Console.WriteLine("姓名:{0}  年龄:{1}  体重 :{2}  爱好:{3}", i.Name, i.Age, i.Weight, i.Hobby);
            }
            Console.WriteLine("*******查询结束*******");
            Console.WriteLine("");
        }

         在客户端代码中调用:

   static void Main(string[] args)
        {
            Demo demo = new Demo();
            //无参数查询
            demo.Search();
            //一个参数查询
            demo.Search("羊");
            //两个参数查询
            demo.Search("羊", 13);
            //三个参数查询
            demo.Search("羊", 13,21);
            //四个参数查询
            demo.Search("羊", 13, 21,"睡");
            Console.Read();
        }
 结果如下:

     我们分别使用了0-4个参数进行查询。


评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值