EntityFramework 插件之EntityFramework.Extended (批量處理)

接手了一個用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 順序

?

轉載于:https://www.cnblogs.com/sephiroth-wzc/p/5798996.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254605.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個傳值的問題”*”與”*”

1/********************************************************* 2* Desc:參數傳遞&#xff1a;使用引用傳遞指針和直接傳遞指針地址的區別 3* Author:charley 4* DateTime:2010-12-7 11:00 02***********************************************************/ 03#include <…

Classification分類halcon算子,持續更新

目錄ClassificationGaussian Mixture Models高斯混合模型add_class_train_data_gmmadd_sample_class_gmmclassify_class_gmmclear_class_gmmclear_samples_class_gmmcreate_class_gmmdeserialize_class_gmmevaluate_class_gmmget_class_train_data_gmmget_params_class_gmmget_…

spring boot 擴展之AutoConfigurationImportListener

最近閱讀spring boot源碼時發現&#xff0c;發現當spring使用ConfigurationClassParser加載使用Configuration注解類后&#xff0c;會使用AutoConfigurationImportSelector對加載的 Configuration注解的類進行一次過濾。當AutoConfigurationImportSelector過濾完成后會自動加載…

classpath: spring 中的查找方式

Spring可以通過指定classpath*:與classpath:前綴加路徑的方式從classpath加載文件,如bean的定義文件.classpath*:的出現是為了從多個jar文件中加載相同的文件.classpath:只能加載找到的第一個文件. 比如 resource1.jar中的package com.test.rs 有一個 jarAppcontext.xml 文件,內…

《高效程序員的45個習慣》-之一

敏捷開發是當下最流行的開發方法&#xff0c;它采用的是一種以人為核心、迭代、循序漸進的開發思想&#xff0c;值得你關注和學習。 最近我就閱讀了一本有關敏捷開發的書籍&#xff0c;《高效程序員的45個習慣》。 它以“舉反例”的方式來講述了敏捷開發中程序員應該運用的…

教你如何在 elasticsearch 中重建索引

序言 Elasticsearch 是一個實時的分布式搜索分析引擎。Teambition 使用 Elastisearch 作為搜索引擎&#xff0c;為用戶提供搜索服務&#xff0c;當我們決定存儲某種數據時&#xff0c;我們需要使用PUT /teambition創建索引&#xff0c;在創建索引的時候需要將數據結構完整確定下…

halcon控制算子Control,持續更新

目錄Controlassignassign_atbreakcasecatchcommentcontinueconvert_tuple_to_vector_1dconvert_vector_to_tupledefaultelseelseifendforendifendswitchendtryendwhileexecutable_expressionexitexport_defforglobalififelseimportinsertpar_joinrepeatreturnstopswitchthrowtr…

《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎 《CLR via C#》之線程處理——線程基礎windows為什么要支持線程線程開銷CPU發展趨勢CLR線程和Windows線程使用專用線程執行異步的計算限制操作線程調度和優先級windows為什么要支持線程 早期的操作系統只有一個執行線程&#xff0c;但同時…

《高效程序員的45個習慣》-之二

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之一。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

MIME Type的介紹

轉載自&#xff1a; http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先&#xff0c;我們要了解瀏覽器是如何處理內容的。在瀏覽器中顯示的內容有 HTML、有 XML、有 GIF、還有 Flash ……那么&#xff0c;瀏覽器是如何區分它們&#xff0c;決定什么內容用什么形式來…

spring boot之從零開始開發自己的網站

概述 首先要感謝兩位大神&#xff0c;該項目的想法來源自tale和MyBlog。 做了一些改造&#xff0c;增加了一些功能和一些代碼的重構&#xff0c;并且更換了博客主題。 關于項目&#xff0c;對于開發的練手項目&#xff0c;能夠工程化&#xff0c;嚴謹一些。 關于文檔&#x…

halcon深度學習算子,持續更新

目錄Deep Learning 深度學習Classification&#xff1a;分類apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…

python day5--正則表達式

#----正則表達式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #預期結果 ^匹配字符開…

WCF系列教程之WCF客戶端調用服務

1、創建WCF客戶端應用程序需要執行下列步驟 (1)、獲取服務終結點的服務協定、綁定以及地址信息 (2)、使用該信息創建WCF客戶端 (3)、調用操作 (4)、關閉WCF客戶端對象 二、操作實例 1、WCF服務層搭建:新建契約層、服務層、和WCF宿主,添加必須的引用(這里不會的參考本人前面的隨…

《高效程序員的45個習慣》-之三

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之二。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

負載均衡的那些事?

什么是負載均衡&#xff1f;1、負載&#xff1a;就是后端系統的承載能力。比如同等條件下&#xff0c;一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差&#xff1b;相同配置下&#xff0c;一個cpu利用率為80%的機器比30%的承載能力一般要差等等。2、均衡&am…

Develop內部函數,持續更新

Develop內部函數 目錄Develop內部函數dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信認證方案,用手機短信進行上網認證如何實現?

WFilter NGF的“Web認證”模塊&#xff0c;提供了一系列的上網認證解決方案。包括如下認證方式&#xff1a;本地用戶名密碼認證AD域用戶名密碼認證企業郵箱用戶名密碼認證Radius用戶名密碼認證微信WiFi認證Facebook Wifi認證除此&#xff0c;WFilter NGF還有一個“其他”的選項…

《高效程序員的45個習慣》-末篇

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之三。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

【Qt開發】V4L2 API詳解 Buffer的準備和數據讀取

前面主要介紹的是&#xff1a;V4L2 的一些設置接口&#xff0c;如亮度&#xff0c;飽和度&#xff0c;曝光時間&#xff0c;幀數&#xff0c;增益&#xff0c;白平衡等。今天看看V4L2 得到數據的幾個關鍵ioctl&#xff0c;Buffer的申請和數據的抓取。1. 初始化 Memory Mapping …