接手了一个用EF来做的项目,由于项目中使用的原生处理,导致很多update都是采用先select 后 update的方式来实现,同时无法批量执行逻辑如:根据订单类型统一更新状态等。所以在经过了N多查找之后 发现了一个国外写的扩展插件EntityFramework.Extended 。

Github:https://github.com/loresoft/EntityFramework.Extended

简单说一下用法:

Deleting

//delete all users where FirstName matches

context.Users

.Where(u => u.FirstName == "firstname")

.Delete();

Update

//update all tasks with status of 1 to status of 2

context.Tasks

.Where(t => t.StatusId == 1)

.Update(t => new Task { StatusId = 2 });

 

//example of using an IQueryable as the filter for the update

var users = context.Users.Where(u => u.FirstName == "firstname");

context.Users.Update(users, u => new User {FirstName = "newfirstname"});

看示例代码就已经很直观了。

还有2个很少被人提到的功能:

将来的查询

建立对你所需要的数据,并在第一时间在任何结果的查询列表被访问,所有数据都将在一个往返到数据库服务器中检索。降低数据查询成本。使用此功能是附加一样简单.Future()您的查询的末尾。要使用将来的查询,确保导入EntityFramework.Extensions命名空间。

将来的查询与下面的扩展方法创建...

  • Future()
  • FutureFirstOrDefault()
  • FutureCount()

Demo

// build up queries

var q1 = db.Users

    .Where(t => t.EmailAddress == "one@test.com")

    .Future();

 

var q2 = db.Tasks

    .Where(t => t.Summary == "Test")

    .Future();

 

// this triggers the loading of all the future queries

var users = q1.ToList();

在上面的例子中,有2个查询建立起来的,只要查询中的一个被枚举,它触发两个查询的批次负载。

// base query

var q = db.Tasks.Where(t => t.Priority == 2);

// get total count

var q1 = q.FutureCount();

// get page

var q2 = q.Skip(pageIndex).Take(pageSize).Future();

 

// triggers execute as a batch

int total = q1.Value;

var tasks = q2.ToList();

在这个例子中,我们必须的任务列表共同senerio。为了使GUI设置寻呼控制,你需要一个总数。随着未来我们可以批量在一起的查询来获得一个数据库调用的所有数据。

将来的查询通过创建保持IQuerable适当IFutureQuery对象工作。然后IFutureQuery对象存储在IFutureContext.FutureQueries列表。然后,当IFutureQuery对象之一被枚举,它调用回IFutureContext.ExecuteFutureQueries()经由LoadAction委托。ExecuteFutureQueries建立从所有的存储IFutureQuery对象批量查询。最后,所有的IFutureQuery对象与从查询的结果进行更新。

查询结果缓存

缓存查询结果,请使用FromCache位于扩展方法EntityFramework.Extensions命名空间。下面是一个示例高速缓存查询结果。简单地构建LINQ查询,你通常会,然后追加的FromCache扩展。

//query is cached using the default settings

var tasks = db.Tasks

    .Where(t => t.CompleteDate == null)

    .FromCache();

 

//query result is now cached 300 seconds

var tasks = db.Tasks

    .Where(t => t.AssignedId == myUserId && t.CompleteDate == null)

    .FromCache(CachePolicy.WithDurationExpiration(TimeSpan.FromSeconds(300)));

查询结果Cache也支持标记缓存,以便您可以通过调用过期常见的缓存条目Expire上的高速缓存标记。

// cache assigned tasks

var tasks = db.Tasks

    .Where(t => t.AssignedId == myUserId && t.CompleteDate == null)

    .FromCache(tags: new[] { "Task", "Assigned-Task-" + myUserId  });

 

// some update happened to Task, expire Task tag

CacheManager.Current.Expire("Task");

在CacheManager对供应商的支持。默认提供程序使用MemoryCache存储缓存条目。要创建一个自定义的供应商,实施ICacheProvider。然后,自定义提供程序将需要在登记Locator容器。

// Replace cache provider with Memcached provider

Locator.Current.Register<ICacheProvider>(() => new MemcachedProvider());

审计日志

审计日志功能将捕捉到的变化随时它们被提交到数据库实体。审核日志仅捕获那些上发生了变化,这些变化的实体,只有属性的实体。该前和记录值之后, AuditLogger.LastAudit就是在这个信息被举行,是一个ToXml()可以很容易把审计日志转换为XML,便于储存方法。

审计日志可以通过在实体上或通过流利的配置API的属性自定义。

流利的配置

// config audit when your application is starting up...

var auditConfiguration = AuditConfiguration.Default;

 

auditConfiguration.IncludeRelationships = true;

auditConfiguration.LoadRelationships = true;

auditConfiguration.DefaultAuditable = true;

 

// customize the audit for Task entity

auditConfiguration.IsAuditable<Task>()

    .NotAudited(t => t.TaskExtended)

    .FormatWith(t => t.Status, v => FormatStatus(v));

 

// set the display member when status is a foreign key

auditConfiguration.IsAuditable<Status>()

    .DisplayMember(t => t.Name);

创建审核日志

var db = new TrackerContext();

var audit = db.BeginAudit();

 

// make some updates ...

 

db.SaveChanges();

var log = audit.LastLog;

 

问题归纳

  1. 为什么没有 update方法 :缺少引用 using EntityFramework.Extensions;
  2. 错误:无法将类型system.data.* 转化为 *.Iquery<entity>:Extended 版本与ef版本不对应,请在nuget中查询匹配版本。
  3. Update 无效,请跟踪sql 脚本 以区分生成的 update where条件是否正确,与lambda 的 常量.Equals(变量) 不同 他是按照顺序生成sql where的所以 生成的 是 常量 is null or 。。。。。。请注意lambda 顺序

 

EntityFramework 插件之EntityFramework.Extended (批量处理)的更多相关文章

  1. 测试EntityFramework,Z.EntityFramework.Extensions,原生语句在不同的查询中的表现。原来池化与非池化设定是有巨大的影响的。

    Insert测试,只测试1000条的情况,多了在实际的项目中应该就要另行处理了. using System; using System.Collections.Generic; using Syste ...

  2. jenkins插件Configuration Slicing plugin批量修改配置

    作用 批量修改jenkins上job配置

  3. [推荐]两款Flash上传插件(1)–CFUpdate文件批量上传组件

    搞开发的同学都知道,网上可搜到的可用的Flash图片上传的组件少之又少,可定制界面,不需要安装组件,且可免费用于任何商业系统的,更是凤毛麟角,如果你和我一样,迫切需要一款这样的一款组件的话,不妨试试C ...

  4. Entity Framework Extended 批量删除

    public static class DbContextExtensions { public static void DeleteBatch<T>(this DbContext con ...

  5. 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

    一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...

  6. (转)EntityFramework.Extensions

    转自:http://www.symbolsource.org/Public/Metadata/NuGet/Project/EntityFramework.Extended/1.0.0.20/Relea ...

  7. 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...

  8. EntityFramework 7 开发纪录

    博文目录: 暂时开发模式 Code First 具体体现 DbContext 配置 Entity 映射关联配置 Migration 问题纪录(已解决) 之前的一篇博文:EF7 Code First O ...

  9. Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)

    接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...

随机推荐

  1. WCF 项目应用连载[3] - 双向通信 实例管理与服务端监控

    WCF 项目应用连载[1] - 索引 - 轻量级的Log系统 - Lig Sample -序 第二节我们已经创建了Lig项目,并且能稳定工作了.现在我们来改进ILigAgent接口,实现WCF的双向通 ...

  2. Swift-Lesson2(下)

  3. [Javascript] Intro to the Web Audio API

    An introduction to the Web Audio API. In this lesson, we cover creating an audio context and an osci ...

  4. [Angular 2] ng-model and ng-for with Select and Option elements

    You can use Select and Option elements in combination with ng-for and ng-model to create mini-forms ...

  5. XML的四种解析方式

    本文描述了构建良好的XML需要遵循的规则.作者详细介绍了构建XML需要考虑的元素,如何命名约定.正确的标记嵌套.属性规则.声明和实体,以及DTD和schema的验证,十分便于新手开始学习了解XML. ...

  6. C++学习路线

    已经确定做C++后台的工作了,因此,要对C++要越来越熟悉才行,今天,在此列出学习和温习C++书籍的顺序,从而由浅入深地学习C++. 1. <C++ primer> 2. <Acce ...

  7. 模拟电路"虚短" & "虚断"

    <虚短 & 虚断> 运算放大器组成的电路五花八门,令人眼花瞭乱,是模拟电路中学习的重点.遍观所有模拟电子技朮的书籍和课程,在介绍运算放大器电路的时候,无非是先给电路来个定性,比如这 ...

  8. node.js常用的几个模块总结

    /** 一 util *      是 node 里面一个工具模块 ,node 里面几乎所有的模块 都会用到 在这个模块 *  功能: *      1 实现继承 这是主要功能 *      2 实现 ...

  9. 开源的Android开发框架-------PowerFramework使用心得(一)总体介绍

    PowerFramework是一款几乎囊括了所有Android基础功能的框架应用,这个框架目前是开源的,开发者可以在这个框架的基础上进行二次开发.结合开发者自己的UI设计,可以很快就能开发出具备基础应 ...

  10. jsp中文乱码终极解决方法(转)

    一, 找出问题的根源乱码可能出现的地方: jsp页面中 jsp页面之间相互传参的参数 与数据库中数据的存取 基本归纳为以上几种. 二, 寻找解决方案 出现在jsp页面中,是由于没有设置jsp页面的中文 ...