疑难杂症——EF+Automapper引发的查询效率问题解析

ef联表查询速度_EF查询之性能优化 关于EF性能优化的讲解,推荐阅读下面的博文a.Entity Framework 延伸系列目录b.采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)c.EntityFramework执行存储过程中遇到的那些坑介绍EF性能优化前补充EF的优缺点:1.EF的优点:* (1)极大提高开发效率。EF是微软自己的产品,跟VS开发工具集成度比较好... 阅读详情

正文

前言:前面总结了一些WebApi里面常见问题的解决方案,本来打算来分享下oData+WebApi的使用方式的,奈何被工作所困,只能将此往后推了。今天先来看看EF和AutoMapper联合使用的一个问题。

最近两周一直在解决一个问题:使用Automapper将EF的Model转换成DTO的Model,数据量只有几百条,但是导航属性比较多,执行 Mapper.Map<List<TM_STATION>, List<DTO_TM_STATION>>(lstEFModel) 这一句的时候需要耗时十多秒钟左右,简直到了用不了的节奏。于是乎各种找资料,好不容易解决了,今天来简单记录下这个过程,也总结下EF里面的一些细节性的东西。

一、问题呈现

项目使用EF 5.0,为了避免UI里面直接调用EF的Model,我们定义了一个中间的实体层DTO,每次查询数据的时候首先通过查询得到EF的Model,然后通过Automapper将EF的Model扁平化转换成DTO的model,就是这么一个简单的过程。为了模拟项目实际场景,博主随便写了一个控制台程序,主要的代码流程如下:

static void Main(string[] args)
{
        //1.创建Automapper的映射,并指定导航属性的转换对应关系
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<TM_STATION, DTO_TM_STATION>()
         .ForMember(dto => dto.TM_PLANT_ID, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.TM_PLANT_ID))
        .ForMember(dto => dto.NAME_C, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C))
        .ForMember(dto => dto.NAME_C1, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.NAME_C))
        .ForMember(dto => dto.UlocName, (map) => map.MapFrom(m => m.TM_ULOC.NAME))
        .ForMember(dto => dto.ArtName, (map) => map.MapFrom(m => m.TM_ART_LINE.NAME_C))
        .ForMember(dto => dto.LineName, (map) => map.MapFrom(m => m.TM_LINE.NAME_C))
        .ForMember(dto => dto.WorkShop, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C));
    });
    var Mappers = config.CreateMapper();

       //2.创建EF的上下文对象并查询得到EF的Model集合(这里是测试的Demo,所以直接new的EF的DBContext,实际项目中多了一个仓储)
    var context = new Entities();
    var lstEFModel = context.Set<TM_STATION>().AsNoTracking().ToList();

    //3.开启计时,使用AutoMapper转换对象
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    var listd = Mappers.Map<List<DTO_TM_STATION>>(lstEFModel);
    sw.Stop();
    var s = sw.ElapsedMilliseconds;
    Console.WriteLine("总共转换" + lstEFModel.Count + "条数据。转换耗时:" + s + "毫秒");

    Console.ReadKey();
}

三次测试的结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果显示:82条数据,总共需要6秒左右。上述代码可以看到,这个实体导航属性很多,并且其中还有某些导航属性存在二级导航属性,尽管如此,82条数据需要6s转换,这个肯定是需要优化的。

二、原因分析

为什么会这么慢呢?刚开始,博主打算从Automapper下手,在想是不是Automapper组件的问题,可是查了一圈资料后发现,最新版的Automapper都是这样用的啊,就连官方文档也是这样写的,并且园子里其他人也有这样用,也没听说性能损耗这么严重的。排除了Automapper的原因,剩下的就是EF了。

1、刚开始,猜想会不会在查询导航属性的时候实时去数据库取的呢?要不然不可能82条数据要这么久。于是乎做了下面的尝试:

static void Main(string[] args)
{            
    //1.创建Automapper的映射,并指定导航属性的转换对应关系
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<TM_STATION, DTO_TM_STATION>()
         .ForMember(dto => dto.TM_PLANT_ID, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.TM_PLANT_ID))
        .ForMember(dto => dto.NAME_C, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C))
        .ForMember(dto => dto.NAME_C1, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.NAME_C))
        .ForMember(dto => dto.UlocName, (map) => map.MapFrom(m => m.TM_ULOC.NAME))
        .ForMember(dto => dto.ArtName, (map) => map.MapFrom(m => m.TM_ART_LINE.NAME_C))
        .ForMember(dto => dto.LineName, (map) => map.MapFrom(m => m.TM_LINE.NAME_C))
        .ForMember(dto => dto.WorkShop, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C));
    });
    var Mappers = config.CreateMapper();
    
    //2.创建EF的上下文对象并查询得到EF的Model集合(这里是测试的Demo,所以直接new的EF的DBContext,实际项目中多了一个仓储)
    var lstEFModel = new List<TM_STATION>();
    using (var context = new Entities())
    {
        lstEFModel = context.Set<TM_STATION>().AsNoTracking().ToList();
    }

    //3.开启计时,使用AutoMapper转换对象
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    var listd = Mappers.Map<List<DTO_TM_STATION>>(lstEFModel);
    sw.Stop();
    var s = sw.ElapsedMilliseconds;
    Console.WriteLine("总共转换" + lstEFModel.Count + "条数据。转换耗时:" + s + "毫秒");

    Console.ReadKey();
}

结果抛了异常:
在这里插入图片描述
我们用using就EF的上下文对象包起来,表示出了using之后,上下文对象就自动释放,可是在Automapper转换的时候报了“对象已经释放”的异常,这正好说明我们之前的猜想是正确的!由于EF默认延时加载(context.Configuration.LazyLoadingEnabled)是开启的,每次去取数据的时候,导航属性都不会被直接取出来。也就是说,Automapper转换的时候是需要数据库连接的,每个对象转换的时候导航属性需要通过这个连接实时去数据库取。难怪这么慢呢,82条记录,从数据库取的次数那得有多少次,吓死宝宝了。知道了这个原因,就晓得努力的方向了。

2、知道了上面的原因,博主把关注点放在了AsNoTracking()的上面。将其转到定义看了下:

// 摘要: 
//     返回一个新查询,其中返回的实体将不会在 System.Data.Entity.DbContext 中进行缓存。
//
// 返回结果: 
//     应用了 NoTracking 的新查询。
public DbQuery<TResult> AsNoTracking();

大概的意思是,加了AsNoTracking()之后,每次的结果不会往DBContext中缓存,换言之,每次都是实时去数据库取最新的,原来罪魁祸首在这里。那当初为什么查询的时候要加上AsNoTracking()这个东西呢,博主网上查了下,它的作用主要有两个:

  1. 提高查询效率。不会缓存就意味着每次去数据库里面取,这样肯定能够提高查询效率;
  2. 保证了数据的实时性。也就是说,每次去数据库里面取到的结果都是最新的,这样能够保证数据的实时性。这个一般用在同一个上下文的情况,如果CURD每次都是一个不同的上下文,就没有这个必要了。

三、解决方案尝试

通过上面的尝试,貌似找到了问题的缘由,是不是这样呢?我们来试一试,其他代码都不变,仅仅把AsNoTracking()去掉。

static void Main(string[] args)
{            
    //1.创建Automapper的映射,并指定导航属性的转换对应关系
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<TM_STATION, DTO_TM_STATION>()
         .ForMember(dto => dto.TM_PLANT_ID, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.TM_PLANT_ID))
        .ForMember(dto => dto.NAME_C, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C))
        .ForMember(dto => dto.NAME_C1, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.NAME_C))
        .ForMember(dto => dto.UlocName, (map) => map.MapFrom(m => m.TM_ULOC.NAME))
        .ForMember(dto => dto.ArtName, (map) => map.MapFrom(m => m.TM_ART_LINE.NAME_C))
        .ForMember(dto => dto.LineName, (map) => map.MapFrom(m => m.TM_LINE.NAME_C))
        .ForMember(dto => dto.WorkShop, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C));
    });
    var Mappers = config.CreateMapper();
    
    //2.创建EF的上下文对象并查询得到EF的Model集合(这里是测试的Demo,所以直接new的EF的DBContext,实际项目中多了一个仓储)
    var context = new Entities();
    var lstEFModel = context.Set<TM_STATION>().ToList();

    //3.开启计时,使用AutoMapper转换对象
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    var listd = Mappers.Map<List<DTO_TM_STATION>>(lstEFModel);
    sw.Stop();
    var s = sw.ElapsedMilliseconds;
    Console.WriteLine("总共转换" + lstEFModel.Count + "条数据。转换耗时:" + s + "毫秒");

    Console.ReadKey();
}

还是来看看三次的测试结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
性能得到不少提升。

可是考虑到数据量并不大,感觉1.5秒左右还是不能令人满意,还想再次优化下。通过上文可以,我们反向理解,去掉了AsNoTracking()之后,每次查询都会在System.Data.Entity.DbContext对象中缓存。有了这个理论做基础,博主去掉AsNoTracking()之后,再次按照上面的代码使用了using测试,结果还是和上文相同:抛了对象已释放的异常。这说明转换导航属性是从DBContext缓存中取得,如果DBContext对象已经释放,自然取不到对应的导航属性。

到这一步,博主是这样理解EF机制的:**为了保证查询的效率,EF会自动启用延时加载,所有的导航属性都需要在调用的时候去数据库或者上下文对象的缓存里面去取。**那么,是否有一次取出所有导航属性的机制呢?考虑到这种情况,微软为我们提供了Include方法,我们需要哪些导航属性,可以使用Include将其查出,我们来看看最后改造的代码:

static void Main(string[] args)
{            
    //1.创建Automapper的映射,并指定导航属性的转换对应关系
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<TM_STATION, DTO_TM_STATION>()
         .ForMember(dto => dto.TM_PLANT_ID, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.TM_PLANT_ID))
        .ForMember(dto => dto.NAME_C, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C))
        .ForMember(dto => dto.NAME_C1, (map) => map.MapFrom(m => m.TM_WORKSHOP.TM_PLANT.NAME_C))
        .ForMember(dto => dto.UlocName, (map) => map.MapFrom(m => m.TM_ULOC.NAME))
        .ForMember(dto => dto.ArtName, (map) => map.MapFrom(m => m.TM_ART_LINE.NAME_C))
        .ForMember(dto => dto.LineName, (map) => map.MapFrom(m => m.TM_LINE.NAME_C))
        .ForMember(dto => dto.WorkShop, (map) => map.MapFrom(m => m.TM_WORKSHOP.NAME_C));
    });
    var Mappers = config.CreateMapper();
    
    //2.创建EF的上下文对象并查询得到EF的Model集合(这里是测试的Demo,所以直接new的EF的DBContext,实际项目中多了一个仓储)
    var context = new Entities();
    var lstEFModel = context.Set<TM_STATION>()
        .Include("TM_WORKSHOP")
        .Include("TM_LINE")
        .Include("TM_ART_LINE")
        .Include("TM_ULOC")
        .ToList();
   //3.开启计时,使用AutoMapper转换对象
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    var listd = Mappers.Map<List<DTO_TM_STATION>>(lstEFModel);
    sw.Stop();
    var s = sw.ElapsedMilliseconds;
    Console.WriteLine("总共转换" + lstEFModel.Count + "条数据。转换耗时:" + s + "毫秒");

    Console.ReadKey();
}

三次测试结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码释疑:优化做到这一步基本就可以了。有园友可能又有了新的疑惑,确实,这样做Automapper的转换是可以了,因为需要的导航属性已经查询到了内存里面,在内存里面做这些转换是很快的,但是,你考虑过EF查询的性能了吗?如果你将所有的导航属性都查出来,那么当查询的数据量大了之后岂不是会很慢!这就是接下来想要说明的几点:

  • 优化需要做到哪一步根据实际情况,如果你的项目对性能要求不太高,上面的1.5秒可以接受,那么我们直接用上面的那种方案即可。
  • 如果确实对查询和转换性能要求都很高,并且你的系统数据量又比较大,那么建议从两个方面同时下手,查询方面使用延时加载;对象转换方面,你可以使用EmitMapper代替Automapper,为了效率更高,甚至你可以手工映射,关于映射工具的效率,可以看看此篇。
  • EF默认是延时加载(懒加载)的,使用Include是一种实时加载的方式,如果你不需要使用导航属性里面的东西,建议使用懒加载。

四、总结

以上通过一次查询优化简单分析了下EF的一些运行机制,文中所有观点来自博主自己的理解,如果有误,欢迎园友们指出,多谢。如果这篇文章能帮助你加深对EF的理解,请帮忙推荐,博主将会继续努力。

C#系列-EF扩展框架AutoMapper应用实例(40) 是一个对象到对象的映射器,它用于将一个对象的属性映射到另一个对象的属性。它主要用于在应用程序的不同层之间传输数据时,自动将数据传输对象(你可以根据你的需求定义更多的映射规则和配置文件,并在你的应用程序中使用它们。)映射到领域模型,或者将领域模型映射到视图模型等。现在,在应用程序的启动代码中,我们需要初始化。在上面的配置中,我们定义了一个映射规则,将。现在,在你的应用程序中,你可以使用注入的。接下来,创建映射配置文件(例如。然后,定义你的领域模型(例如。应用实例,它演示了如何在。实例添加到依赖注入容器中。 阅读详情

相关推荐

掌握AutoMapper与EF Core映射技巧

本篇博客深入探讨了AutoMapper在实体到数据传输对象(DTO)映射中的应用,以及Entity Framework Core(EF Core)在处理实体类与数据库交互时的策略。我们了解了如何使用AutoMap属性简化简单映射配置,以及如何利用Profile类处理复杂映射。此外,还探讨了如何注册AutoMapper配置,以及EF Core在创建实体类实例时如何使用构造函数和依赖注入。

weixin_29069575的博客 674

浅谈AsNotracking()

我们都知道EF默认情况下对数据的访问都是启用模型跟踪。 Entity Framework在第一次对象加载到内存中时进行一次快照,添加快照发生在返回一次查询或添加一个对象到DbSet中时。当Entity Framework需要知道对象的变动时,将先把当前实体与快照中的对象进行扫描对比。实现扫描对比的方法是调用DbContext.ChangeTracker的DetectChanges方法。   变...

歇息的专栏 2万+

automapper-nartc:(已弃用)一个automapper-ts叉子(由Bert Loedeman撰写)

不建议使用的警告: 由于我只是重构了整个映射逻辑并移到了一个新程序包因此不再维护该程序包。 您仍然可以使用此automapper-nartc但将不再对其进行维护和更新。 AutoMapper-Nartc 这是的automapper-ts的。 我的目标是在自己学习TypeScript同时,使用更强类型的方法重新创建这个很棒的库。 文献资料 Github页面 动机 我知道AutoMapper在TypeScript非常薄弱,因为Reflection是如何在TypeScript 。 但是,最好有某种类型的Mapper可以用于NodeJS开发。 特征 功能是有限的,因为我决不是TypeScript还是AutoMapper专家,我正计划进行更多研究以为该库提供更多AutoMapper功能。 到目前为止,支持以下内容: 两个类之间的基本映射 嵌套类的基本映射 数组/列表映射 展平 Reve

Find 方法、where 子句以及 AsNoTracking 方法各自有不同的用途和性能

在 Entity Framework (EF) 中,Find方法、where子句以及方法各自有不同的用途和性能考虑。下面我将分别解释它们的作用,并对比它们的优缺点。

愿你历尽千帆,归来仍是少年。 1033

【Unity】【模型】【AI建模】如何将AI生成的GLB格式3D模型文件导入Unity

本文介绍了一个将AI工具自动生成的GLB格式3D模型文件转换成fbx模型文件导入Unity的步骤。

O青草O的博客 Unity和游戏制作知识分享 1357

【02】【VisionMaster V4.0.0 】安装教程—— 授权文件更新报错:应用程序与本地LM通讯出错(怀疑电脑加密 和 上网受限 造成的 )

本文详细介绍了海康VisionMaster 4.0试用版的安装流程及常见问题解决方案。主要内容包括:1)从官网下载基础安装包、试用补丁和授权文件;2)按顺序安装主程序、补丁和授权文件;3)针对授权失败问题提供两种解决方案(更换未加密电脑或使用加密狗);4)说明试用版的功能限制(30天试用期、2个流程限制等)。文章特别指出电脑加密可能导致授权失败,并提供了安装报错时的处理建议,为初次使用者提供了完整的安装指导。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 7140

EFCore优化之AsNoTracking

快照更改跟踪 1、如果通过DbContext查询出来的对象只是用来展示不会发生状态改变,则可以使用AsNoTracking()来"禁用跟踪" 2、分别加AsNoTracking()和不加,分别查看一个对象修改后的EntityEntry信息 3、如果查询出来的对象不会被修改、删除等,那么查询是可以AsNoTracking(),就能降低内存占用 ...

ahao214——Dreamspace 1716

S7-1200控制S120变频器

②:硬件目录下,添加实物S120设备进行组态(其它现场设备--PROFINET IO--DRIVES......②:双击S120进行IP地址和设备名称设置(注:此处要与STATER软件设置S120一致)M10.0接通时,电机开始运行,M10.0断开,电机停止,调试完成。①:将S7-1200与S120进行通讯连线。④:STATER软件下设置与组态一致的报文。①:点击添加新设备,按实物进行设备组态。②:打开OB1,编写启动停止程序。①:查看S120报文地址。②:模块下添加DO矢量。③:子模块下添加报文。

weixin_38261173的博客 4867

AsNoTracking()非跟踪数据 查询

刚开始学习使用EF ,做项目时需要查询数据将数据显示在datagrid中,使用如下方法: query是IQueryable的 在一次看别人写的代码的时候,发现了AsNoTracking()这个方法,并进行了了解 针对查询,在一些情况下,我们只需要返回一个只读的数据就可以,并不会对数据记录进行任何的修改。这种时候不希望Entity Framework进行不必要的状态变动跟踪, 可以使用Enti...

xingkongvv12的博客 586

从数据手册到代码:一步步解读SC7A20寄存器配置与加速度值换算原理

本文详细解析了SC7A20三轴加速度传感器的寄存器配置与加速度值换算原理。从数据手册出发,逐步拆解关键寄存器设置,并推导原始ADC值到物理加速度的完整换算过程,帮助开发者深入理解传感器底层工作原理,提升嵌入式开发效率。

weixin_29179311的博客 366

工业级隔离CAN FD收发器ISO1042设计实战:从原理到EMC防护

在工业自动化与伺服驱动系统中,CAN总线是实现设备间可靠通信的关键技术。其核心原理是通过差分信号传输和仲裁机制,在复杂电磁环境中实现多节点实时数据交换。这项技术的核心价值在于为高噪声、高干扰的工业现场提供了稳定、确定性的通信基础,是构建分布式控制系统不可或缺的环节。其典型应用场景包括新能源汽车电池管理、工业机器人伺服控制以及光伏逆变器集群通信等。本文将聚焦于如何通过高性能隔离CAN FD收发器(如TI的ISO1042)来应对地电位差、浪涌和高压串扰等现场挑战,深入解析其集成的电气隔离、±70V总线故障保护和

weixin_26834815的博客 382

EF知识和经验

AsNoTracking提高查询性能 AsNoTracking的作用就是在查询的时候不做追踪,这样会查询的更快,但是这样做会有一个缺陷(不能对查询的数据做修改操作)。 var student2 = db.T_Student.Where(c => c.Name == "李四50").Take(5).AsNoTracking().ToList(); EF查询之性能优化技巧 EF知识和经验...

weixin_30824479的博客 324

Windows环境下ABAQUS、Fortran 编译器及Visual Studio的安装和关联

点击Continue,在随后的弹窗中勾选accept,并点击Customize(注意,在接下来的安装图片中,显示的版本号是2024.2,图片来自于一次失败的安装,懒得再截图了,步骤毫无区别,请见谅)。在下一步中,保持默认选项,之后软件会自动关联到刚才安装到visual studio,随后下一步进行安装(如果电脑中已经安装有其他版本的visual studio,则只保留2022)。在随后的弹窗中,根据指示找到。以防万一,尽量暂时退出所有杀毒软件,关闭防火墙,一般不会有影响,为确保万无一失,可以执行此步。

samurai12的博客 9945

EF-AsNoTracking()

小弟是第一次接触EF这个ORM,在使用时发现甚是方便尽管有性能上的担忧。但是我现在接触到的都是简单使用,简单到我甚至不需要动脑子,所以一直在找深入使用的东西。偶然发现了一种AsNoTracking()的用法,尽管能够见名知意但我觉得还是有必要研究一下其具体意义。果不其然,它带我打开了深入理解EF的一扇门。 跟踪数据与非跟踪数据的内容,如果我能了解一些并合理使用的话,对我来说就算是EF学习的进步之一...

课后笔记 1万+

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

Robot_PLC_HMI_Automation 347

YOLO11涨点优化:半监督学习 | 结合Unbiased Teacher框架,利用海量无标签数据实现自训练暴力涨点

本文提出了一种基于Unbiased Teacher v2的半监督学习方法,用于解决YOLO11目标检测模型在标注数据不足时的性能瓶颈问题。通过分析纯监督YOLO11在小样本场景下的局限性,揭示了朴素自训练方法的三大陷阱:确认偏差、类别不均衡和噪声累积。文章详细解析了Unbiased Teacher框架的核心设计理念,包括教师-学生模型互监督机制、类别平衡损失和Burn-In预热策略,并重点介绍了v2版本针对无锚框检测器的优化。最后提出将Unbiased Teacher与YOLO11相结合的融合架构设计方案,

2601_95807009的博客 207

C#AsNoTracking()详解

是 Entity Framework (EF) 和 Entity Framework Core (EF Core) 中的一个 LINQ 查询扩展方法,用于指示 EF。EF、EFCore中的查询默认是跟踪的,使用AsNoTracking()禁用跟踪查询时,对实体类的更新不会起作用,但是对于大数据量的查询会显著提升查询效率。如果因为性能原因使用了非跟踪查询,更新时需要显式地将实体附加到上下文并标记为已修改状态。:避免将非跟踪实体传递到需要跟踪的代码中。:EF 会监视实体属性的变化。查询返回的实体对象。

weixin_46761444的博客 632

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Design】ASP.NET MVC + EF + AutoMapper + T4 多模型项目设计方案

简介 我们最常见项目架构就是三层架构,其中必少不了Model,但在一个项目中,肯定不止用一种模型 比如DataModel(数据模型),Dto(数据传输对象),ViewModel(视图模型) 其中各个模型的作用 DataModel用于DAL层与数据库数据传输 Dto用于BLL层与UI层数据传输 ViewModel用于UI层的输入验证和数据展示 可能有人会说,我只用一个模型不行吗?...

GreAmbWang的博客 688

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

AutoMapper.EF6 使用教程

AutoMapper.EF6 使用教程 1. 项目介绍 AutoMapper.EF6 是一个用于简化 AutoMapper 与 Entity Framework 6 结合使用的扩展库。它提供了一些便捷的方法,使得在 Entity Framework 6 中使用 AutoMapper 更加容易。通过这个库,你可以直接将数据库实体映射到 DTO(数据传输对象),并且支持计算属性(Computed Pr...

gitblog_00587的博客 724

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

automapper.ef6的用法

如果是在webapi项目中使用的话,可以直接使用依赖注入的方式注入automapper,然后直接使用automapper就可以了。在ef6中使用automapper.ef6,需要安装两个包,automapper和automapper.ef6,由于是在仓储层使用,并且不是.netcore项目,所有没有使用依赖注入,创建了一个全局的帮助类。最后就可以使用automapper的projectTo方法去做映射了。1、首先创建了一个配置文件类。2、然后创建了一个帮助类。

小白的专栏 862

AsNoTracking

引用:http://www.cnblogs.com/zhaopei/p/5721789.html 原文提到的AsNoTracking不可以随便使用,AsNoTracking会去掉其引用性质,可能会使得添加数据的时候,当添加的数据使用了查询得到的子数据时,使数据库/DbContext找不到原来...

chumoteng6705的博客 857

[今日记录]EFCore跟踪与非跟踪查询 AsNoTracking()

[学习记录]EFCore跟踪与非跟踪查询 AsNoTracking()

qq_43527485的博客 1202

为什么顶尖团队都在用AsNoTrackingWithIdentityResolution?真相令人震惊!

掌握EF Core性能优化秘诀,AsNoTrackingWithIdentityResolution成顶尖团队首选。适用于高频读取场景,兼顾查询性能与实体一致性,避免重复加载。相比AsNoTracking,它能自动解析导航属性中的同一实体,减少内存占用。高效、稳定、值得收藏。

ProcePerch的博客 394
上一篇: Automapper如何全局配置map条件过滤null值空值对所有映射起效
下一篇: Js中的window.parent ,window.top,window.self 详解
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值