多条件动态查询是任何一个数据系统都会处理的问题。如果使用纯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个参数进行查询。
本文介绍了在Entity Framework(EF)中实现多条件动态查询的一种简单方法,避免了动态生成委托的复杂性。通过动态组装查询计划,可以根据用户输入灵活地进行不同数量条件的查询操作。
2万+





