C# Entity单条件查询与多条件查询

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查询也是非常方便的。
拖沓冗长写了半天,其实就是写给记性不好的自己,能给别人带来借签,自然是好事,也请各位莫怪。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值