linq和EF查询的用法和区分

我们做项目时,难免会遇到用的不知道是啥,及把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查询
				
时间: 2024-12-24 07:29:36

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

linq to ef(相当于sql中in的用法)查询语句

select * from DoctorInfo doctor where doctor.HosDepartId in (select Id from HospitalDepartment hd where hd.DepartmentId=5) var a=from d in _entity.HospitalDepartment where d.DepartmentId==5 select d; List<int> lst=new List<int>();foreach(var b

应用开发之Linq和EF

上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知识点.hibernate也是ORM框架.记得hibernate里面有一个叫HQL.先不管HQL的好与坏.主要是明白HQL的目地是什么.ORM的思想就是为了让用户在操作数据的时候用上面向对象的思想来看,而不是二维数据了.所以HQL笔者认为就是一个面向对象思想的SQL语句.那么为什么笔者要讲到HQL呢?事实上笔者

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

本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知识点.hibernate也是ORM框架.记得hibernate里面有一个叫HQL.先不管HQL的好与坏.主要是明白HQL的目地是什么.ORM的思想就是为了让用户在操作数据的时候用上面向对象的思想来看,而不是二维数据了.所以HQL笔者认为就是一个面向对象思想的SQL语句.那么为什么笔者要讲到HQL呢?

EF查询数据库框架的搭建

一个简单的EF查询框架除了运行项目外,大概需要5个类库项目,当然这个不是一定要这样做,这可以根据自己的需要设置有多少个项目.这里介绍的方法步骤只适合EF零基础的人看看就是了. 在开始之前,先建立一个运行项目,不管是MVC还是winfrom项目,只要能运行就OK,这是为了在后面能测试EF框架的地方. 一.模型项目.这个项目主要负责与数据库映射的,里面的类都是数据库表的实体. 首先在解决方案中建一个文件夹EFModel,这里将会收纳所有的与EF查询有关的项目,这样做只是为了将他们与运行项目分开而已,

EF查询生成的SQL

在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL. 1 using (var context = new TestDBEntities()) 2 { 3 var query = from p in context.Parents 4 where p.Name == "zhaokun" 5 select p; 6 7 ObjectQuery<Parent> parents = query as ObjectQuery

Entity Framework 4.1 之八:绕过 EF 查询映射

原文名称:Entity Framework 4.1: Bypassing EF query mapping (8) 原文地址:http://vincentlauzon.wordpress.com/2011/04/21/entity-framework-4-1-bypassing-ef-query-mapping-8/ 看到 Entity Framework 4.1 推荐英文教程,为了帮大家看起来方便一些,简单翻译一下.这是一个系列,共有 8 篇,这是第 8 篇. Entity Framework

Linq to EF 中Contains的演变

在早期Linq to EF中没有提供对Contains方法的支持, 那时候只能将所有数据获取到内存中,然后通过Linq to Object的Contains方法来达到相同的效果(如果多表筛选也可以使用Any方法实现,也可采用自定义linq的方式实现,但这里我们主要讨论使用数组筛选表的情况). 从Linq to EF 4.0 开始加入了对Contains的支持,使用方式如下: 以上linq最终会被翻译为如下形式的sql语句: SELECT [Extent1].[Name] AS [Name] FR

【转】Linq to EF 与Linq to Object 使用心得

大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象. 两者单独查询时都不会出现什么问题,不过混合在一起时(一般是用关键字来join连接),要注意的地方就多着了. 情形1:Linq to Object 连接(join) Linq to Entity 我们首先来看这段代码:(注意:Linq代码里是把内存中的数据代码,也就是Linq to object放在join前面,数据库的数据代码放在joi

linq 和lambda查询

EF 查询的两种 写法. linq 方法 或者 lambda方法 其中 ,只有tolist()的时候,才会真正的 在数据库中执行. 如果没有 tolist 方法,那么province1是 iqueable类型 原文地址:https://www.cnblogs.com/bingyizhihun/p/10013148.html