我们做项目时,难免会遇到用的不知道是啥,及把linq和EF搞混了

今天我带领大家梳理下思路:

首先说linq查询,然后介绍EF查询

1.linq查询

当我们使用linq查询时,转到定义会调到Queryable 类,  那么也就是说,这个类封装了linq所有查询的方法,那么我们来研究研究这个类

MSDN上是这样解释的:提供一组用于查询实现 IQueryable<T> 的数据结构的 static(在 Visual Basic 中为 Shared)方法。

命名空间:   System.Linq
程序集:  System.Core(System.Core.dll 中)

通过截图可以看出是提供了“IQueryable<T> 的数据结构的 static方法"。

那么有的人可能并不知道IQueryalbe是干啥的,那么我来解释下:

IQueryable和IList一样,是用于接收一组数据的集合,
那么IQueryable和IList有有何区别,看下面
-------------------------------------------------------------------------------------
1.IQeurable(IQuerable<T>)不会立即在内存里创建持久数据,只有遍历它(如通过foreach)、把它转换成List等情况下才会向内存加载数据,它可以实现“延期执行”,如果当前被加载的实体有关联实体(associations),此关联实体可被接下来的访问加载。
2.IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,如果被加载的实体有关联实体(associations),此关联实体不会被加载(既不立即加载,也不延迟加载)。
看下面一段代码:
//IList的情况
IList users = res.ToList(); //此时已把users加载到内存,而每个user的关联实体(UserInfos)未被加载,所以下一行代码无法顺利通过var ss = users.Where(p => p.UserInfos.ID != 3); //此处报错,因为P的UserInfos实体无法被加载
这提醒了我们有关联实体时,不要使用ToList();
// IQuerable的情况
IQueryable users = res.AsQueryable(); //users未被立即加载,关联实体可通过“延迟加载”获得var ss = users.Where(p => p.UserInfos.ID != 3);//此处顺利获得对应的ss
--------------------------------------------------------------------------------------------------- 上面提到了IList和IQueryalbe,那么再把这两个方法扩展下,弄清到底是什么东东?
-------------------------------------------------------------------------------------
首先看Ilist介绍:
继承顺序如下:
Ilist->ICollection ->IEnumerable
->Ilist
为了方便理解,我把知道的都Copy过来好了
首先IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。

  它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,IList<T>可以胜任。

  不过,更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList<T>就爱莫能助了。

  1、当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.

  2、IList <>是个接口,定义了一些操作方法这些方法要你自己去实现

  List <>是泛型类,它已经实现了IList <>定义的那些方法

  IList <Class1> IList11 =new List <Class1>();

  List <Class1> List11 =new List <Class1>();

  这两行代码,从操作上来看,实际上都是创建了一个List<Class1>对象的实例,也就是说,他们的操作没有区别。

  只是用于保存这个操作的返回值变量类型不一样而已。

  那么,我们可以这么理解,这两行代码的目的不一样。

  List <Class1> List11 =new List <Class1>();

  是想创建一个List<Class1>,而且需要使用到List<T>的功能,进行相关操作。

  而

  IList <Class1> IList11 =new List <Class1>();

  只是想创建一个基于接口IList<Class1>的对象的实例,只是这个接口是由List<T>实现的。所以它只是希望使用到IList<T>接口规定的功能而已。
->Ilist->ICollection->IEnumerable
ICollection就不介绍了,直接介绍最基础的IEnumerable
IEnumerable它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代
IList介绍完毕,接着看IQueryalbe
转到定义可以看到和IList一样,继承自IEnumerable<T>
-------------------------------------------------------------------------------------
 Queryable类提供的基本查询方法:Where,Select,,,
举例:user.Select(u=>u.id).AsQueryable(); db.User.Where().ToList();
linq查询介绍完毕! 2.EF查询
转到定义可以看到,所有EF查询方法都继承自DbSet类,那么我们就以这个类说起:
简要截图:

这个类提供了我们最常用的方法 :Add(TEntity entity),Remove(TEntity entity),Find(params object[] keyValues)
EF查询介绍完毕!

End:看了上面的介绍,有些人会纠结linq中的select,where和find用法怎么觉得用哪个也行,接下来我来区分下:
select提供方法如下:
public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector);
where提供的方法如下:
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate);
find提供的方法如下:
public virtual TEntity Find(params object[] keyValues);
根据我实际测试得知:如果有主外键表相关操作时,用EF的find方法,其余能通用的都能通过,
另外注意上面的返回值类型,linq两个方法返回的都是集合,find返回的是单个实体。但有一点是,它们都可以用var来接收

linq和EF查询的用法和区分的更多相关文章

  1. Linq To EF 用泛型时生成的Sql会查询全表的问题

    1.问题的现象 public class LinqHepler<T> where T:class { private EFDBContext _context = null; /// &l ...

  2. LINQ,EF联合查询join

    public object GetListAdmin() { //return db_C56.Admins //   .Where(a => a.Status != "D") ...

  3. Java进击C#——应用开发之Linq和EF

    本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知 ...

  4. Linq to EF 与Linq to Object 使用心得

    大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象. 两者单独查询时都不会出现什么问题,不过 ...

  5. EF查询生成的SQL

    在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL. using (var context = new TestDBEntities()) { ...

  6. EF查询数据库框架的搭建

    一个简单的EF查询框架除了运行项目外,大概需要5个类库项目,当然这个不是一定要这样做,这可以根据自己的需要设置有多少个项目.这里介绍的方法步骤只适合EF零基础的人看看就是了. 在开始之前,先建立一个运 ...

  7. EF查询百万级数据的性能测试--多表连接复杂查询

    相关文章:EF查询百万级数据的性能测试--单表查询 一.起因  上次做的是EF百万级数据的单表查询,总结了一下,在200w以下的数据量的情况(Sql Server 2012),EF是可以使用,但是由于 ...

  8. EF 查询视图出现重复数据

    解决方案: 由多张表组成的视图,要加实体键.而且实体键组合要能确保唯一性. 个人理解:确保唯一性,一个或多个实体键,实现了复合主键或组合主键的效果. 这样查询是,延迟加载机制,才知道哪些需要重新从数据 ...

  9. asp.net core系列 32 EF查询数据 必备知识(1)

    一.查询的工作原理 Entity Framework Core 使用语言集成查询 (LINQ) 来查询数据库中的数据. 通过 LINQ 可使用 C#(或你选择的其他 .NET 语言)基于派生上下文和实 ...

随机推荐

  1. 【转载】PMC/PEC Boundary Conditions and Plane Wave Simulation

    原文链接 PMC/PEC Boundary Conditions and Plane Wave Simulation (FDTD) OptiFDTD now has options to use Pe ...

  2. opencv 3.0 DPM Cascade 检测 (附带TBB和openMP加速)

    opencv 3.0 DPM cascade contrib模块 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ ...

  3. Adaboost 卡口车辆检测训练

    之前做了SVM的车脸检测,主要是针对车脸,接下来尝试利用Adaboost和Haar进行车脸的检测.我利用的主要是opencv中的cascade,其已经把Adaboost相关的算法做成了exe,直接调用 ...

  4. java使用HttpClient传输json格式的参数

    最近的一个接口项目,传的参数要求是json,需要特殊处理一下. 重点是这两句话: httpPost.setHeader("Content-Type", "applicat ...

  5. 配置 AEM CQ6 (author + publish + apache dispatcher + ubuntu )

      AEM CQ系列是Adobe下的企业内容管理系统,现在已知的一些企业比如 Deloitte,Ford Racing,这里就不多做基本的介绍了,明白的看! 今天在Docker配置一下author i ...

  6. RabbitMQ 一二事(3) - 订阅模式(微信公众号模式)的应用

    之前讲的消费者互相可以把队列中的消息全部读取,但是不是读完整的所有信息 那么采用订阅模式就行,这就是微信公众号的模式, 比如10个人订阅了我的公众号"BeJavaGod",当我发送 ...

  7. 第2章 面向对象的设计原则(SOLID):5_迪米特法则

    5. 迪米特法则(Law of Demeter,LoD) 5.1 定义 (1)应尽量减少其他对象之间的交互,对象只和自己的朋友交谈,即对其他依赖的类越少越好(不要和太多的类发生关系). (2)尽量不要 ...

  8. C# explicit与implicit

    1.它们解决什么问题? 考虑下面的需求,Person类有个字段age.我想使用Person p = (Person) 18 来创建一个age为18的Person对象,怎么办? 更进一步,我想使用Per ...

  9. C#代码规范 .NET程序员需要提升的修养

    一.  环境设置  首先去除VS开发环境中的一些选项如下: 粘贴时调整缩进 将类型的左大括号置于新行 将方法的左大括号置于新行 将匿名方法的左大括号置于新行 将控制块的左大括号置于新行 将“else” ...

  10. javascript:让表单 文本框 只读,不可编辑的方法

    有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使<input type="text" name="input1" value=&qu ...