封裝自己通用的 增刪改查的方法 By EF

来源:https://www.cnblogs.com/Fengge518/archive/2019/11/01/11780028.html
-Advertisement-
Play Games

封裝自己的通用CURD By EF ...


封裝自己的通用CURD By EF

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using MODEL;

namespace ZRFDEMO.DAL
{
    public class BaseDAL<T> where T:class  //----這裡我們可以實現 新增一個泛型的介面 如: IbaseDAL<T>.......
    {
        //1.創建EF上下文
        ZRFEntityes db = new ZRFEntityes();//---這裡我們可以使用線程內唯一來優化,

        public BaseDAL()
        {
            //關閉 ef 檢查
            db.Configuration.ValidateOnSaveEnabled = false;
        }

        #region 0.0 批量更新EF容器數據到資料庫 +int SaveChanges()
        /// <summary>
        /// 0.0 批量更新EF容器數據到資料庫
        /// </summary>
        /// <returns>返回受影響行數</returns>
        public int SaveChanges()
        {
            return db.SaveChanges();
        } 
        #endregion

        #region 1.0 新增方法 +void Add(T model)
        /// <summary>
        /// 1.0 新增方法
        /// </summary>
        /// <param name="model"></param>
        public void Add(T model)
        {
            //1.直接通過EF上下文的 Set方法 獲取一個 針對於 T類 做操作的 DbSet對象
            //var dbSet = db.Set<T>();
            //dbSet.Add(model);
            db.Set<T>().Add(model);
        } 
        #endregion

        #region 2.0 刪除方法 +void Delete(T model)
        /// <summary>
        /// 2.0 刪除方法
        /// </summary>
        /// <param name="model"></param>
        public void Delete(T model)
        {
            DbEntityEntry entry = db.Entry<T>(model);
            entry.State = System.Data.EntityState.Deleted;
        } 
        #endregion

        #region 2.1 條件刪除方法 +void DeleteBy(System.Linq.Expressions.Expression<Func<T, bool>> delWhere)
        /// <summary>
        /// 2.1 條件刪除方法
        /// </summary>
        /// <param name="delWhere">要刪除的元素查詢條件</param>
        public void DeleteBy(System.Linq.Expressions.Expression<Func<T, bool>> delWhere)
        {
            var delList = db.Set<T>().Where(delWhere);
            foreach (T model in delList)
            {
                Delete(model);
            }
        }
        #endregion

        #region 3.0 修改實體 + void Modify(T model, params string[] propertyNames)
        /// <summary>
        /// 3.0 修改實體
        /// </summary>
        /// <param name="model"></param>
        /// <param name="propertyNames"></param>
        public void Modify(T model, params string[] propertyNames)
        {
            DbEntityEntry entry = db.Entry<T>(model);
            entry.State = System.Data.EntityState.Unchanged;
            foreach (string proName in propertyNames)
            {
                entry.Property(proName).IsModified = true;
            }
        } 
        #endregion

        #region 4.0 查詢方法 +IQueryable<T> Where(Expression<Func<T, bool>> whereLambda)
        /// <summary>
        /// 4.0 查詢方法
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public IQueryable<T> Where(Expression<Func<T, bool>> whereLambda)
        {
            return db.Set<T>().Where(whereLambda);
        } 
        #endregion

        #region 4.1 查詢方法 -帶排序 +IQueryable<T> WhereOrder<TKey>
        /// <summary>
        /// 4.1 查詢方法 -帶排序
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <param name="whereLambda"></param>
        /// <param name="keySelector">u=></param>
        /// <param name="isAsc"></param>
        /// <returns></returns>
        public IQueryable<T> WhereOrder<TKey>(Expression<Func<T, bool>> whereLambda, Expression<Func<T, TKey>> keySelector, bool isAsc = true)
        {
            if (isAsc)
                return db.Set<T>().Where(whereLambda).OrderBy(keySelector);
            else
                return db.Set<T>().Where(whereLambda).OrderByDescending(keySelector);
        } 
        #endregion

        #region 4.2 查詢方法 -帶Include +IQueryable<T> WhereInclude
        /// <summary>
        /// 4.2 查詢方法 -帶Include
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <param name="includePropertyNames">要進行連接查詢的 屬性名</param>
        /// <returns></returns>
        public IQueryable<T> WhereInclude(Expression<Func<T, bool>> whereLambda, params string[] includePropertyNames)
        {
            DbQuery<T> dbQuery = db.Set<T>();
            foreach (string includeName in includePropertyNames)
            {
                dbQuery = dbQuery.Include(includeName);
            }
            return dbQuery.Where(whereLambda);

            //DbQuery<T> dbSet = (DbQuery<T>)db.Set<T>().Where(whereLambda);
            //foreach (string includeName in includePropertyNames)
            //{
            //        dbSet = dbSet.Include(includeName);
            //}
            //return dbSet;
        }
        #endregion

        #region 4.3 查詢方法 -帶Include 和 排序 +IQueryable<T> WhereInclude<TKey>
        /// <summary>
        /// 4.3 查詢方法 -帶Include 和 排序
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <param name="whereLambda"></param>
        /// <param name="keySelector"></param>
        /// <param name="isAsc"></param>
        /// <param name="includePropertyNames"></param>
        /// <returns></returns>
        public IQueryable<T> WhereInclude<TKey>(Expression<Func<T, bool>> whereLambda, Expression<Func<T, TKey>> keySelector, bool isAsc = true, params string[] includePropertyNames)
        {
            DbQuery<T> dbQuery = db.Set<T>();
            foreach (string includeName in includePropertyNames)
            {
                dbQuery = dbQuery.Include(includeName);
            }
            IQueryable<T> query = dbQuery.Where(whereLambda);
            if (isAsc)
                return query.OrderBy(keySelector);
            else
                return query.OrderByDescending(keySelector);
        } 
        #endregion

        #region 4.4 查詢方法 - 分頁+Include+排序 + void WherePaged<TKey>
        /// <summary>
        /// 4.4 查詢方法 - 分頁+Include+排序
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <param name="pagedData"></param>
        /// <param name="whereLambda"></param>
        /// <param name="keySelector"></param>
        /// <param name="isAsc"></param>
        /// <param name="includePropertyNames"></param>
        public void WherePaged<TKey>(MODEL.FormatMODEL.PagedData pagedData, Expression<Func<T, bool>> whereLambda, Expression<Func<T, TKey>> keySelector, bool isAsc = true, params string[] includePropertyNames)
        {
            //0.獲取 要操作的 數據表 對應的查詢對象
            DbQuery<T> dbQuery = db.Set<T>();
            //1.include 屬性
            foreach (string includeName in includePropertyNames)
            {
                dbQuery = dbQuery.Include(includeName);
            }
            IOrderedQueryable<T> orderQuery = null;
            //2.排序
            if (isAsc) orderQuery = dbQuery.OrderBy(keySelector);
            else orderQuery = dbQuery.OrderByDescending(keySelector);
            //3.分頁查詢
            pagedData.ListData = orderQuery.Where(whereLambda).Skip((pagedData.PageIndex - 1) * pagedData.PageSize).Take(pagedData.PageSize).ToList();
            //4.獲取總行數
            pagedData.RowCount = orderQuery.Where(whereLambda).Count();
        } 
        #endregion
    }
}

  

另外我們還可新增查詢Sql的方法,這就不過多啰嗦了!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、取整處理 1.int() 向下取整 內置函數 2.round() 四捨五入 內置函數 3. floor() 向下取整 math模塊函數 floor的英文釋義:地板。顧名思義也是向下取整 4.ceil()向上取整 math模塊函數 ceil的英文釋義:天花板。 5.modf() 分別取整數部分和小 ...
  • python day 20: 線程池與協程 2019/11/1 [TOC] 資料來自老男孩教育 2. 線程 線程適用於IO密集流操作,線程是最小的執行單元 線程之間數據是共用的,共用一塊記憶體 import threading :導入線程模塊 t = threading.Thread(target=f ...
  • 1. DDL相關 a. b. c. 2. 查詢表總共有多少條數據, 一般有如下3中寫法, 推薦優先使用 count(1) 或 count(id) 3. 單條插入 4. 批量插入(插入條數100條至10000條以內性能高, 具體插入條數看插入的欄位個數和欄位值的字元數, 推薦1000條) 5. 單條更 ...
  • 今天我要和大家分享的是 AOP(Aspect Oriented Programming)這個東西,名字與 OOP 僅差一個字母,其實它是對 OOP 編程方式的一種補充,並非是取而代之。翻譯過來就是“面向方面編程”,可我更傾向於翻譯為“面向切麵編程”。它聽起有些的神秘,為什麼呢?當你看完這篇文章的時候 ...
  • 想從一個序列中隨機抽取若幹元素,或者想生成幾個隨機數。 random 模塊有大量的函數用來產生隨機數和隨機選擇元素。比如,要想從一個序列中隨機的抽取一個元素,可以使用random.choice() : 為了提取出N 個不同元素的樣本用來做進一步的操作,可以使用random.sample() 如果你僅 ...
  • 一、排查思路 最直接也是最有效的辦法:看console控制台 這是我看到的原因,我先想到是不是web.xml里的url-pattern里的命名是不是衝突 因為我在這個項目之前寫了一個項目,用的是同一個tomcat,單個啟動上一個項目是沒有任何問題的,所以排除掉不是tomcat本身的問題 接下來,我在 ...
  • 本解決方案是一個Windows應用編程框架和UI庫,包括四個項目: Ligg.EasyWinForm是一個Winform應用編程框架和UI庫。通過這個該框架,不需任何代碼,通過XML配置文件,搭建任意複雜的Windows應用界面,以類似Execel公式的方式實現基本的過程式控制制(賦值、條件判斷、迴圈、 ...
  • 本章主要想和大家分享下正則表達式的一些基礎用法,希望能夠對一些小白有所幫助,也為了防止自己以後遺忘相關知識點。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...