转眼一看,又过了10几天没有写博客了,主要还是没有什么可以写的,因为遇到的问题都不是很有价值。不过最近发现用lambda表达式,比用Linq的代码量会少一些,而且也方便一些。不过两者都差不多,相差不是特别大。

在EF core中,表和表之中都有对应的关系,例如一对一,一对多,还有多对多。要实现一对一,一对多加上主外键,实现多对多则需要加上一个中间表,这样结构清晰,维护也非常的方便。

那我们在使用EF core 势必要用到非常多的跨表查询,来看看linq是怎样查找数据库中的信息的:

var query = from a in db.ExaminationOrderInfo
join b in db.ExaminationOrganization on a.OrganizationId equals b.OrganizationId
join c in db.Customerinfo on a.CustomerId equals c.CustomerId
join d in db.Supplierinfo on a.OrganizationId equals d.OrganizationId
where (a.IsDelete == )
&& (appointmentResult == null || a.AppointmentResult == appointmentResult)
&& (isPaperReport == null || a.IsPaperReport == isPaperReport)
&& (examinationStatus == null || a.ExaminationStatus == examinationStatus)
&& (name == null || a.Name == name)
&& (id == null || a.IdCard == id)
&& (organizationName == null || b.Name == organizationName)
&& (customer == null || c.Name == customer)
&& (supplierName == null || d.Name == supplierName)
orderby a.AppayTime
select new ExaminationOrderInfoDto
{
Type = a.Type == ? "取消预约" : "预约",
IdCard = a.IdCard,
Name = a.Name,
StartTime = a.StartTime.ToString(),
EndTime = a.EndTime.ToString(),
AppayTime = a.AppayTime,
ExaminationTime = a.ExaminationTime.ToString(),
AppointmentResult = a.AppointmentResult == ? "成功" : a.AppointmentResult == ? "失败" : "待处理",
ExaminationStatus = a.ExaminationStatus == ? "已登记" : "未登记",
IsPaperReport = a.IsPaperReport == ? "已打印" : "未打印",
ElectronicReport = a.ElectronicReport,
Organization = b.Name,
Customer = c.Name,
SupplierName = d.Name
};

可以看出连接了三张表去查询也就是 join....on.... ,然后加上排序,这样代码会偏多一点。

那么我们来看看使用lambda表达式会怎么样:

 var query = db.ExaminationOrderInfo.Where(e => e.IsDelete ==
&& (appointmentResult == null || e.AppointmentResult == appointmentResult)
&& (isPaperReport == null || e.IsPaperReport == isPaperReport)
&& (examinationStatus == null || e.ExaminationStatus == examinationStatus)
&& (string.IsNullOrEmpty(name) || e.Name == name)
&& (string.IsNullOrEmpty(customer) || e.Customerinfo.Name == customer)
&& (string.IsNullOrEmpty(id) || e.IdCard == id)
&& (string.IsNullOrEmpty(organizationName) || e.ExaminationOrganization.Name == organizationName)
&& (string.IsNullOrEmpty(supplierName) || e.ExaminationOrganization.SupplierInfo.Name == supplierName)).Select(e => new ExaminationOrderInfoDto
{
Type = e.Type == ? "取消预约" : "预约",
IdCard = e.IdCard,
Name = e.Name,
Expire = DateTime.Now > e.ExaminationTime ? "是" : "否",
StartTime = e.StartTime.ToString(),
EndTime = e.EndTime.ToString(),
AppayTime = e.AppayTime,
ExaminationTime = e.ExaminationTime.ToString(),
AppointmentResult = e.AppointmentResult == ? "成功" : e.AppointmentResult == ? "失败" : "待处理",
ExaminationStatus = e.ExaminationStatus == ? "已登记" : "未登记",
IsPaperReport = e.IsPaperReport == ? "已打印" : "未打印",
ElectronicReport = e.ElectronicReport,
Organization = e.ExaminationOrganization.Name,
Customer = e.Customerinfo.Name,
SupplierName = e.ExaminationOrganization.SupplierInfo.Name
}).OrderBy(e => e.AppayTime);

我们可以看到使用lambda表达式就没有太多的连接代码了,如果想要查询的话,直接就e.Customerinfo.Name 可以得到Customerinfo表的name了,这是为什么呢,因为ExaminationOrderInfo这个实体中有这个字段:

 public Customerinfo Customerinfo { get; set; }

这就将ExaminationOrderInfo和Customerinfo连接起来了,一个ExaminationOrderInfo对应一个Customerinfo,而相信大家也留意到了ExaminationOrganization这个表了,里面对应的关系是这样的:

public ICollection<ExaminationOrderInfo> ExaminationOrderInfo { get; set; }

也就是说一个ExaminationOrganization对应多个ExaminationOrderInfo。那么还有 e.ExaminationOrganization.SupplierInfo.Name,为何需要这样呢,是因为ExaminationInfo是通过ExaminationOrganization这张表和Supplier连接的。

相信大家已经清楚了这两张查询方式的不同,建议大家两种都去了解和熟悉,这样遇到问题的时候有多种思考方式,不过我一般建议大家用lambda表达式,这样代码非常简洁,易读性也较高。

最后,有什么错误请指出,互相学习。谢谢大家!

EF core 中用lambda表达式和Linq的一些区别的更多相关文章

  1. entity framework 新手入门篇(1.5)-lambda表达式与linq

    在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以la ...

  2. c# in deep 之Lambda表达式于LINQ表达式结合后令人惊叹的简洁(2)

    当Lambda表达式和LINQ一起使用时,我们会发现原本冗长的代码会变得如此简单.比如我们要打印0-10之间的奇数,让其从高到低排列并求其平方根,现在只用一行代码即可完成其集合的生成,直接上代码: v ...

  3. C# Lambda表达式和linq表达式 之 匿名对象查询接收

    很多小伙伴都用过Lambda表达式和linq表达式,用起来也得心应手,但是有的小伙伴 对匿名对象的查询与接收比较迷茫,(没有定义相应的实体),怎么在where()里面进行 条件筛选呢?常规用法我就不说 ...

  4. C#从委托、lambda表达式到linq总结

    前言 本文总结学习C#必须知道的基础知识,委托.监视者模式.常用lambda表达式.linq查询,自定义扩展方法,他们之间有什么关系呢?匿名委托是如何演变成lambda表达式,lambda再如何导出l ...

  5. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

  6. C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

    1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...

  7. .net Lambda表达式与Linq (LINQ TO object)

    Lambda表达式,是用来写匿名方法的. 在委托用得比较多,因为委托是传递方法的.   定义几个委托: public delegate void DoNoThing();//无参无返回值   publ ...

  8. C# 基础知识系列- 6 Lambda表达式和Linq简单介绍

    前言 C#的lambda和Linq可以说是一大亮点,C#的Lambda无处不在,Linq在数据查询上也有着举足轻重的地位. 那么什么是Linq呢,Linq是 Language Intergrated ...

  9. LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

随机推荐

  1. js之可迭代对象

    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Set都属于iterable类型. 具有iterabl ...

  2. [SQL SERVER系列]工作经常使用的SQL整理,实战篇(二)[原创]

    工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇(三) 接着上一篇“工作经常使用的SQL整 ...

  3. mysql三:表操作

    一.存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制. 详见:点击查看 二.表的介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标 ...

  4. 洛谷P2312 解方程(暴力)

    题意 题目链接 Sol 出这种题会被婊死的吧... 首先不难想到暴力判断,然后发现连读入都是个问题. 对于\(a[i]\)取模之后再判断就行了.注意判断可能会出现误差,可以多找几个模数 #includ ...

  5. 学习canvas

    canvas简介 ​ <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是那么 ...

  6. es6变量解构赋值的用途

    这里是我觉得es6解构赋值,在平时我们写js的时候非常有用,而且经常用到的地方,能简化我们的代码,让写代码简介优雅易读; 用途 1.交换变量的值,太方便了这逼,写法不仅简介而且一看就明白 let [x ...

  7. Java入门到精通——调错篇之Spring2.5使用AOP时报错only available on JDK 1.5 and higher

    一.问题描述及原因. 在Spring2.5Aop例子中的时候会出现一个错误only available on JDK 1.5 and higher,大概意思就是需要JDK1.5甚至更高版本.但是我用的 ...

  8. Latex 中cite的使用

    (一).设置上标显示的命令 可以在引言区增加类似如下的重定义命令:   \newcommand{\upcitep}[1]{\textsuperscript{\textsuperscript{\cite ...

  9. matlab练习程序(演化策略ES)

    还是这本书上的内容,不过我看演化计算这一章是倒着看的,这里练习的算法正好和书中介绍的顺序是相反的. 演化策略是最古老的的演化算法之一,和上一篇DE算法类似,都是基于种群的随机演化产生最优解的算法. 算 ...

  10. 学习笔记-java 多线程

    背景说明: 多线程并发与管理,是java基础知识里的重点,本文根据<java核心技术第八版>中的多线程技术的学习,对知识点进行整理:这里只对基础知识点进行简单罗列,以达到对知识点有网状关联 ...