Entity Framework基础-第三篇

查询的两种过滤方法:

1.linq to EF 数据库中过滤: 下图我们能看出来Linq表达式在执行的时候已经为我们生成高效的sql语句,

DemoTestEntities dbContext = new DemoTestEntities();
var demoTest = from u in dbContext.UserInfo
                           where u.UserId>0
                           select u;
 foreach (var item in demoTest)
 {
     Console.WriteLine(item.Age + "," + item.Name);
 }

打开Sql Server Profiler ,看下到底生成了什么样的sql语句

分析下Linq表达式的返回值:

linq返回值用var来替换,其实它返回值是IQueryable<>类型,

f12能看到它继承(暂这样理解)IEnumerable<T>,IQuery,IEnumerable。

扩展下IQueryable<out T>中这个out起什么作用呢?我们就先简单的了解下"协变"和"逆变":

协变out(安全):就是把一个子类的泛型集合赋值给父类的泛型集合,调用的时候用的是父类的泛型集合,一般用在方法的返回值,所以当集合中有out的时候可以用这个集合的父类来替换它接收数据。

代码如下:

//IQueryable可以用IEnumerable来替换或者替换成IQueryable<object>
IQueryable<UserInfo> demoTest = from u in dbContext.UserInfo
                           where u.UserId>0
                           select u;
//也可以把子类的泛型集合赋值给父类泛型集合
IQueryable<object> objTest=demoTest;

//也可以直接接收
IEnumerable<UserInfo> demoTest = from u in dbContext.UserInfo
                           where u.UserId>0
                           select u;
IQueryable<object> demoTest = from u in dbContext.UserInfo
                           where u.UserId>0
                           select u;

逆变in(安全):把父类的泛型赋值给子类泛型集合,这有点难理解,为啥父类赋值给子类是安全的呢?

原因是当子类赋值给父类时,父类还是调用自己的方法。逆变难点是"谁在用传过来的这个参数",下面的代码看似是把父类的泛型约束给子类,但是不用,真正调用的时候是在{}括号里面,关键再用的时候要保证安全

Action<object> action  =  (a)  => { Console.WriteLine(a.GetType().Name); };
Action<UserInfo> sunAction  = action;
sunAction(new UserInfo());

从上面介绍可以知道,所有的返回参数都是协变(也可以理解成外部调用),所有的传入参数都是逆变(也可以理解成内部调用)。在编译阶段会把代码补充完整,本质还是内部进行转换,只不过是编译不对其报错,其实就是语法糖。

2.Linq to object内存过滤:把数据库中所有的数据都查询到程序中,在进行过滤(大数据时,不易用这种)

DemoTestEntities dbContext = new DemoTestEntities();
            //把数据从UserInfo表中所有数据都取出来,转换成List集合,然后在遍历这集合过滤
            //list集合存放在当前程序的内存中,所以说这种方法是本地过滤
var demoTest = from u in dbContext.UserInfo.ToList()
                           where u.UserId>0
                           select u;
            foreach (var item in demoTest)
            {
                Console.WriteLine(item.Age+","+item.Name);
            }

下面简单分析下两种方式的本质区别:

其实这两种方式其实是IQueryable接口集合和List集合的区别,

1.IQueryable

用F12看下IQueryable<> 有个IQueryable类,在类中有三个属性ElementType,Expression,Provider:

下图介绍了三个属性在初始化和调用时起到了什么作用,也可以解释为啥linq能to 各种(to sql,to obj,to ef,to xml):

通过IL看到linq表达式都编译成一个Expression,所有都转换成一个表达式树

2.List

时间: 2024-12-21 07:35:30

Entity Framework基础-第三篇的相关文章

Entity Framework基础&mdash;第四篇(Model First)

用Model First构建实体模型,步骤如下: 1.创建一个实体模型 2.创建实体:在实体数据模型设计器中右击鼠标新增一个实体 3.新增属性: 4.属性设置(F4): 5.添加关联: 6.根据模型生成数据库   添加数据: static void Main(string[] args) { Add(); } /// <summary> /// 添加数据 /// </summary> private static void Add() { //1.创建上下文 DataModelCo

NHibernate 映射基础(第三篇) 简单映射、联合主键

NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来一个简单的例子,然后随着不断地对这个例子修修改改,从而真正了解映射文件.具体的资料可以查看http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 先来看一张表: 映射文件Product.hbm.xml: <?xml versi

实体框架- Entity Framework 基础篇

以前写数据层D层的时候里面有好多的SQL语句,如何省略到繁琐的SQL语句,微软提供了一种很好的方式-实体框架-Entity Framwork.一种对象映射机制,支持.NET开发人员使用域特定对象来出来关系数据,消除了对开发人员通常需要编写的大部分数据访问代码的需求. ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.实体框架Entity Framework是ADO.NET中的一组支持开发面向数据的软件

Entity Framework基础—第二篇

实体框架(Entity Framework) 简称EF,属于数据持久(持久保存)架里面的一种,其他的还有NHibernate,ibaties,Dapper.PetaPOCO...等,都是基于ORM思想. 首先介绍下O/R Mapping(ORM) 1.什么是ORM?ORM指的是面向对象的对象模型和关系数据库的数据结构之间的相互转化,可以理解为把表实体和表相互转化(在任何平台都适用,如php,java等). 传统ADO.net操作数据库: 基于ORM思想操作数据库: 接下来我们就一步步创建项目:

实体框架(Entity Framework)快速入门--实例篇

在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 第一步:创建控制台项目 这个就不多说了,如果新建项目你还不知道,那先去学学基础吧. 第二步:创建实体模型 在项目上右击 添加新建项目→Ado .Net 实体数据模型 如下图所示: 第三步:与现有的 数据库 进行连接生成EF实体 在做这步之前,首先确定你是否已经有现有数据库,当然在这提供我自己的数据库脚本.

Entity Framework 基础

一.什么是Entity Framework 微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上.EF提供变更跟踪.唯一性约束.惰性加载.查询事物等.开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事. EF有三种使用场景,1. 从数据库生成Class,2.由实体类生成数据库表结构,3.  通过数据库可视化设计器设计数据库,同时生成实体类. O/RM是什么? ORM 是将数据存储从域对象自动映射到关系型数据库的工具.ORM主要包

Entity Framework基础01

学习了ADO.NET的相关知识,掌握了它对数据库表的基本操作,但是实际在开发项目应用中微软为我们开发ef这个ORM,使用它可以很方便的利用ADO.NET来操作DBMS,使得我们开发项目的着重点放在业务逻辑层上面,从而轻数据库的设计. 一:Entity Framework 1 解释   *ef说白了就是对ADO.NET的包装,它可以将数据库中的数据变成实体的模型,也可以将模型变成为数据库中的表,很是方便.   *ef里面重要的就是数据上下文.它是生成数据查询语句的关键.结果实际返回的是IQuery

Python基础第三篇

一.collections系列 Counter是对字典类型的补充,用于追踪值的出现次数,具备字典的所有功能 + 自己的功能 1.计数器Counter import collections a='abababsbsbhh' c=collections.Counter(a) #直接列出每个元素出现了几次,传入列表和元组也一样 print(c) #输出:Counter({'b': 5, 'a': 3, 'h': 2, 's': 2}) #most_common 列出Counter内的前几个 print

Django Restful Framework【第三篇】认证、权限、限制访问频率

一.认证 认证请求头 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import