1.概述
Entity也就是常说的EntityFramework,通过VS新建Data中EF 5.0x或EF 6.x而加入项目工程。使用它的基础是linq,它的底层应用实际是ADO.net。Entity操作快捷方便,避免用户直接用操作数据库,同时有效地避免了SQL注入,这也是我比较喜欢用它的一个原因。
2.条件查询
其他增删改操作这里不做介绍,只谈我自己使用查询时的方法。作为初级C#爱好者,也是从各位朋友那里学习到的,将它记录为笔记的同时,也希望给不太熟悉EF查询的朋友带来借签,俗话说得好,赠人玫瑰,手有余香。
我们遇到的查询方式大致有两种,一种是只有一个查询输入框,我称它为单条件,如下图:
另一个就是多个查询选项,我称它为多条件,如下图:
单条件查询,虽然只有一个输入查询框,但它查询的内容却不只是一项,而是好几项,因此可以得出一个逻辑关系,那就是查询语句在这多项内容之间是“或”的关系。
多条件查询,有着多个输入查询条件框,查询语句自然能看出是“与”的关系。
单条件查询,往往是模糊查询,多条件查询,多数是精确查询。
3.查询语句
Entity使用linq查询,而linq语句中经常会有些对象方法不能使用,常常因为组合查询语句而带来一些困扰和不便,因此,我们可以用linq的表达式Expression来解决。
Expression原定义是Expression< TDelegate >,可以看出它使用了委托,实际应用中,我们常用Expression<Func<T, TResult>>方式,也就是Express<Func<类, bool>>是我们要用的,其中参数“类”,我是写成了汉字,实际就是指查询的Entity在数据库模型中Model.Context.cs自动生成对应数据表的类。返回结果是bool型,对应linq语句中的where查询。简单说就是将linq查询中where,从一条语句改成了一个多条语句的函数。
Expression表达式的写法,是一条lambda语句构成,例如:
Expression<Func<Student,bool>> express = stud => stud.Maths >= 90;//没有参数的表达式
此表达式为学生数学成绩大于等于90分。Expression 存储了运算逻辑,可以将其保存成抽象语法树,在运行时动态获取运算逻辑。多余地也不再多说,具体看代码。
(1).单条查询。
下面对Student类进行单条件查询,查询语文、数学和英语有一门成绩在90分以上的学生,此时查询条件就成了参数。
double score = 90.0;
Expression<Func<Student,bool>> expr = stud => Search(Student,score);
Search是一个返回bool类型的函数方法。
bool Search(Student stu,double score)
{
bool express = true;
express |= stu.Language > score;
express |= stu.Maths > score;
express |= stu.Englist > score;
//以上三条语句与express = stu.Language > score || stu.Maths > score || stu.Englist > score是一样的
return express;
}
Expression语句使用时,需要其Compile方法编译表达式树,描述为可执行代码的 lambda 表达式,并生成一个委托去执行,放置到linq的where处。
var result = Student.Where(expr.Compile());
result就是查询的结果,可以根据需要再进一步处理。
大家可能认为以上情况没有必要使用表达式,因为在where语句中就直接能实现,确实如此,简单情况下不需要用表达式,但是在一些特殊要求下,表达式会更方便,而且语法结构清晰。
(2).多条件查询
多条件查询是“与”的关系,如果在多个查询框中只填写个别查询条件,那么为空的几个查询框在where语句中处理就比较困难了,但是用表达式就非常方便。还是以上面Student为例,有年级、班级和姓名三个查询框,三项可全查,也可查两项或一项。
//Grade是要查询的年级,Class是要查询的班级,Name是要查询的姓名
bool Search(Student stu, string Grade, string Class, string Name)
{
bool express = true;
//年级不为空
if(!string.IsNullOrEmpty(Grade))
express &= stu.Grade.Contains(Grade);//模糊查询年级
//班级不为空
if(!string.IsNullOrEmpty(Class))
express &= stu.Grade.Contains(Class);//模糊查询班级
//姓名不为空
if(!string.IsNullOrEmpty(Name))
express &= stu.Grade.Contains(Name);//模糊查询姓名
//全部为空则返回false
if(string.IsNullOrEmpty(Grade)&&string.IsNullOrEmpty(Class)&&string.IsNullOrEmpty(Name))
express = false;
return express;
}
Expression语句:
Expression<Func<Student,bool>> expr = stud => Search(Student, Grade, Class, Name);
查询语句要把表达式用Compile方法编译生成委托,写到linq语句的where处
var result = Student.Where(expr.Compile());
表达式不仅适用于Entity查询,同样适用linq操作的其他对象,对于我们常用的List查询也是非常方便的。
拖沓冗长写了半天,其实就是写给记性不好的自己,能给别人带来借签,自然是好事,也请各位莫怪。