接手了一个用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. web系统架构的演进变化很形象

    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只需一个应用, ...

  2. Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等

    本文属于原创,转载请著名出处:http://flysnow.iteye.com/blog/906770 写道 在我们开发一些如短消息.应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用 ...

  3. [转] C++临时变量的生命周期

    http://www.cnblogs.com/catch/p/3251937.html C++中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量. 主要的用途主要有两类: 1) 函数的 ...

  4. Codeforces Round #291 (Div. 2) C - Watto and Mechanism 字符串

    [题意]给n个字符串组成的集合,然后有m个询问(0 ≤ n ≤ 3·105, 0 ≤ m ≤ 3·105) ,每个询问都给出一个字符串s,问集合中是否存在一个字符串t,使得s和t长度相同,并且仅有一个 ...

  5. KMP学习笔记

    功能 字符串T,长度为n. 模板串P,长度为m.在字符串T中找到匹配点i,使得从i开始T[i]=P[0], T[i+1]=P[1], . . . , T[i+m-1]=P[m-1] KMP算法先用O( ...

  6. java.util.concurrent.atomic 类包详解

    java.util.concurrent包分成了三个部分,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concurren ...

  7. POJ 1011 sticks 搜索

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 125918   Accepted: 29372 Descrip ...

  8. Android开发--WIFI实现

    wifi的基本结构 在Android的官方文档中定义了如下五种状态: WIFI_STATE_DISABLING  WIFI网卡正在关闭  0 WIFI_STATE_DISABLED   WIFI网卡不 ...

  9. oracle 的变量的定义和赋值

    第一种 :先定义后赋值 代码 : declare     V_AgeingType        varchar2(500); begin V_AgeingType :='111'; end 第二种 ...

  10. mysql复习增删改查

    select * from torder where status='退款申请' UPDATE torder SET `status`='退款申请' WHERE status='等待付款' and i ...