中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

asp.netcore中怎么定義數(shù)據(jù)訪問層

asp.net core中怎么定義數(shù)據(jù)訪問層,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供淮濱企業(yè)網(wǎng)站建設,專注與網(wǎng)站設計、網(wǎng)站制作、H5網(wǎng)站設計、小程序制作等業(yè)務。10年已為淮濱眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設公司優(yōu)惠進行中。

1. 數(shù)據(jù)實體

通常情況下,一個項目的數(shù)據(jù)實體中字段并不是完全沒有規(guī)律可尋。通常情況下,必須有一個主鍵。有些時候,會要求在數(shù)據(jù)表中增加上次修改時間和創(chuàng)建時間,以及創(chuàng)建人和修改人的主鍵。

所以,我們可以創(chuàng)建一個泛型父類,來幫我們定義這些公共字段:

using System;

namespace Data.Infrastructure
{
   public class BaseEntity<T>
   {
       public T Id { get; set; }

       public string ModifyUserId { get; set; }

       public DateTime? ModifyTime { get; set; }


       public string CreatorId { get; set; }
       public DateTime? CreateTime { get; set; }
   }
}
 

看上述代碼里,命名空間并不在Data里,而是在Data.Infrastructure里。這個命名空間 Infrastructure 用來存放一些項目的架構類或者接口,里面還會其他的類。

那么,給這個類補充一些可能有用的方法:

public void Create(object userId)
{
   CreatorId = userId.ToString();
   CreateTime = DateTime.Now;
}

public void Create(object userId, DateTime createTime)
{
   CreatorId = userId.ToString();
   CreateTime = createTime;
}

public void Modify(object userId)
{
   ModifyUserId = userId.ToString();
   ModifyTime = DateTime.Now;
}

public void Modify(object userId, DateTime modifyTime)
{
   ModifyUserId = userId.ToString();
   ModifyTime = modifyTime;
}
 

這里用來保存用戶ID的字段,我都用了字符串做保存,是借用字符串類型保存數(shù)據(jù)時能容納更多的數(shù)據(jù)類型。

 

2. 常見數(shù)據(jù)操作接口

在正常開發(fā)中,一個完整的數(shù)據(jù)操作接口會有很多分類,但是很多時候我們需要分開增刪改和查詢這兩種操作。對于數(shù)據(jù)庫而言,視圖和有些數(shù)據(jù)表都是不被允許改變的,這時候就需要我們只對調(diào)用方開放查詢接口,而不開放修改接口。

所以,在Domain下應該有以下兩個接口:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Domain.Infrastructure
{
   /// <summary>
   /// 修改接口
   /// </summary>
   /// <typeparam name="T"></typeparam>
   public interface IModifyRepository<T>
   {
       /// <summary>
       /// 插入數(shù)據(jù)
       /// </summary>
       /// <param name="entity"></param>
       /// <returns></returns>
       T Insert(T entity);
       /// <summary>
       /// 插入數(shù)據(jù)
       /// </summary>
       /// <param name="entities"></param>
       void Insert(params T[] entities);
       /// <summary>
       /// 插入數(shù)據(jù)
       /// </summary>
       /// <param name="entities"></param>
       void Insert(IEnumerable<T> entities);
       /// <summary>
       /// 保存已提交的修改
       /// </summary>
       /// <param name="entity"></param>
       void Update(T entity);
       /// <summary>
       /// 保存已提交的修改
       /// </summary>
       /// <param name="entities"></param>
       void Update(params T[] entities);
       /// <summary>
       /// 更新數(shù)據(jù)
       /// </summary>
       /// <param name="predicate"></param>
       /// <param name="updator"></param>
       void Update(Expression<Func<T, bool>> predicate, Expression<Func<T, T>> updator);
       /// <summary>
       /// 刪除
       /// </summary>
       /// <param name="entity"></param>
       void Delete(T entity);
       /// <summary>
       /// 刪除數(shù)據(jù)
       /// </summary>
       /// <param name="entities"></param>
       void Delete(params T[] entities);
       /// <summary>
       /// 根據(jù)條件刪除數(shù)據(jù)
       /// </summary>
       /// <param name="predicate"></param>
       void Delete(Expression<Func<T,bool>> predicate);
       /// <summary>
       /// 刪除主鍵對應的數(shù)據(jù)
       /// </summary>
       /// <param name="key"></param>
       void DeleteByKey(object key);
       /// <summary>
       /// 刪除主鍵對應的數(shù)據(jù)
       /// </summary>
       /// <param name="keys"></param>
       void DeleteByKeys(params object[] keys);
   }
}
 

上述是更新接口,那么我們回過頭來寫查詢接口,查詢接口的方法有很多。我們先創(chuàng)建一個接口文件:

using System;
using System.Linq.Expressions;

namespace Domain.Infrastructure
{
   /// <summary>
   /// 查詢接口
   /// </summary>
   /// <typeparam name="T"></typeparam>
   public interface ISearchRepository<T>
   {

   }
}
 

一個查詢接口應該包括以下方法:

  • 獲取單個數(shù)據(jù)

/// <summary>
/// 根據(jù)主鍵獲取數(shù)據(jù)
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
T Get(object key);
/// <summary>
/// 查詢
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
T Get(Expression<Func<T,bool>> predicate);
 
  • 統(tǒng)計數(shù)量:

/// <summary>
/// 返回數(shù)據(jù)庫中的數(shù)據(jù)條目
/// </summary>
/// <returns></returns>
int Count();
/// <summary>
/// 返回數(shù)據(jù)庫中的數(shù)據(jù)條目,類型為Long
/// </summary>
/// <returns></returns>
long LongCount();
/// <summary>
/// 返回符合條件的數(shù)據(jù)數(shù)目
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
int Count(Expression<Func<T,bool>> predicate);
/// <summary>
/// 返回長整形的符合條件的數(shù)目
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
long LongCount(Expression<Func<T,bool>> predicate);
 
  • 存在性判斷

/// <summary>
/// 是否存在滿足條件的數(shù)據(jù)
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
bool IsExists(Expression<Func<T, bool>> predicate);
 
  • 查詢

// <summary>
/// 返回數(shù)據(jù)庫中所有記錄
/// </summary>
/// <returns></returns>
List<T> Search();
/// <summary>
/// 返回所有符合條件的數(shù)據(jù)
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
List<T> Search(Expression<Func<T,bool>> predicate);
/// <summary>
/// 返回一個延遲查詢的對象
/// </summary>
/// <returns></returns>
IEnumerable<T> Query();
/// <summary>
/// 返回一個延遲查詢的對象,并預設了一個查詢條件
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
IEnumerable<T> Query(Expression<Func<T,bool>> predicate);
 
  • 排序

/// <summary>
/// 排序查詢,默認升序
/// </summary>
/// <param name="predicate"></param>
/// <param name="order"></param>
/// <typeparam name="P"></typeparam>
/// <returns></returns>
List<T> Search<P>(Expression<Func<T, bool>> predicate, Expression<Func<T, P>> order);
/// <summary>
/// 排序查找,指定是否降序排列
/// </summary>
/// <param name="predicate"></param>
/// <param name="order"></param>
/// <param name="isDesc"></param>
/// <typeparam name="P"></typeparam>
/// <returns></returns>
List<T> Search<P>(Expression<Func<T, bool>> predicate, Expression<Func<T, P>> order, bool isDesc);
 
  • 分頁

實際上分頁的接口定義模型需要兩個類的輔助,如果沒有這兩個類,接口的定義會變得十分復雜,不利于代碼的可讀性:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Data.Infrastructure
{
   /// <summary>
   /// 分頁條件模型
   /// </summary>
   /// <typeparam name="T"></typeparam>
   public class PageCondition<T>
   {
       /// <summary>
       /// 查詢條件
       /// </summary>
       /// <value></value>
       public Expression<Func<T, bool>> Predicate { get; set; }
       /// <summary>
       /// 排序字段
       /// </summary>
       /// <value></value>
       public string OrderProperty { get; set; }

       /// <summary>
       /// 升序排序或者降序排序,升序為 asc或者空,降序為desc
       /// </summary>
       /// <value></value>
       public string Sort{get;set;}
       /// <summary>
       /// 每頁最大數(shù)據(jù)容量
       /// </summary>
       /// <value></value>
       public int PerpageSize { get; set; }
       /// <summary>
       /// 當前頁
       /// </summary>
       /// <value></value>
       public int CurrentPage { get; set; }
   }
   /// <summary>
   /// 分頁結果
   /// </summary>
   /// <typeparam name="T"></typeparam>
   public class PageModel<T>
   {
       /// <summary>
       /// 數(shù)據(jù)
       /// </summary>
       /// <value></value>
       public List<T> Items { get; set; }
       /// <summary>
       /// 當前頁碼
       /// </summary>
       /// <value></value>
       public int CurrentPage { get; set; }
       /// <summary>
       /// 每頁最大數(shù)據(jù)容量
       /// </summary>
       /// <value></value>
       public int PerpageSize { get; set; }
       /// <summary>
       /// 查詢數(shù)據(jù)總數(shù)
       /// </summary>
       /// <value></value>
       public long TotalCount { get; set; }
       /// <summary>
       /// 總頁碼
       /// </summary>
       /// <value></value>
       public int TotalPages { get; set; }
   }
}
 

這是兩個輔助類,可以簡單看一下如果這些參數(shù)不進行封裝直接傳給方法,可以預見方法的參數(shù)列表會特別長,這對于可讀性和可維護性來說簡直就是災難。我曾經(jīng)接手過一個項目的維護,上一位開發(fā)者在一個方法寫了近15個參數(shù),而且還有大量的可選參數(shù),嗯,十分頭疼。所以,我不建議大家這樣寫,一個方法參數(shù)超過4個我建議還是封裝一下。

那么,看一看方法的聲明:

/// <summary>
/// 根據(jù)分頁參數(shù)設置,進行分頁查詢
/// </summary>
/// <param name="condition"></param>
/// <returns></returns>
PageModel<T> Search(PageCondition<T> condition);

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

本文標題:asp.netcore中怎么定義數(shù)據(jù)訪問層
鏈接分享:http://www.rwnh.cn/article42/gspghc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計做網(wǎng)站、網(wǎng)站維護響應式網(wǎng)站、電子商務網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計
南川市| 临江市| 察雅县| 汝城县| 汉源县| 建水县| 旬邑县| 青岛市| 宜兴市| 鹰潭市| 宾川县| 蓝田县| 札达县| 齐齐哈尔市| 阿拉善盟| 海阳市| 琼结县| 南涧| 孟州市| 普定县| 保德县| 天祝| 格尔木市| 斗六市| 铜梁县| 荥阳市| 禹州市| 芦溪县| 汝南县| 达拉特旗| 东海县| 富川| 玉山县| 普宁市| 兴义市| 巩义市| 丽水市| 巩留县| 东乡族自治县| 镇原县| 肥乡县|