YDal可能是東半球最好.Net Core ORM框架


typora-copy-images-to: static


ydal

項目框架介紹

可能是東半球最好netcore ORM框架,目前暫時支援mysql、mssql,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源程式碼,開箱即用。
It may be the best NETCORE ORM framework in the eastern hemisphere. At present, it temporarily supports MySQL and MSSQL, and its core design goal is to open

特此聲明

重複造輪子僅為netcore開源貢獻自己一份力量,讓用戶在orm框架上多一份選擇,可以免費商用並提供永久技術支援

使用步驟

安裝dll

Install-Package ydal
Install-Package YDal.CodeGenerator 

也可以使用nuget管理客戶端進行安裝

注入程式碼

 public void ConfigureServices(IServiceCollection services)
 {
            services.AddControllers();

             services
               .AddDal()//類庫核心功能
               .AddDalCodeGenerator();//程式碼生成器專用,生成框架程式碼之後請注釋這段程式碼AddDalCodeGenerator; 
 }           

生成框架程式碼配置

{
    //連接資料庫專用
    "ConnectionStrings": {
        "DefaultConnection": "server=localhost;uid=root;pwd=123456;port=3306;database=test;sslmode=Preferred;",
        "DbType": "MySQL"  //無此配置,默認mysql
    }
    //mssql連接字元串 Data Source=192.168.1.110;Initial Catalog=test;Persist Security Info=True;User ID=test;Password=123456;MultipleActiveResultSets=True;App=EntityFramework;
    //程式碼生成器插件使用 
    "DbOption": {
        "ConnectionString": "server=localhost;uid=root;pwd=123456;port=3306;database=test;sslmode=Preferred;",
        "DbType": "MySQL", //mssql  mysql
        "Author": "作者名稱",
        "OutputPath": "F:\\app\\y-dal\\cs", //生成程式碼路徑
        "ModelsNamespace": "Samples.Models", //實體命名空間
        "IRepositoryNamespace": "Samples.Repository", //倉儲介面命名空間
        "RepositoryNamespace": "Samples.Repository.Impl", //倉儲命名空間
        "IServicesNamespace": "Samples.Services", //服務介面命名空間
        "ServicesNamespace": "Samples.Services.Impl", //服務命名空間
        "Tables":"" //指定表名生成,多個用逗號隔開,為空全部
    }
}

測試

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Samples.Models;
using Samples.Repository;

namespace Samples.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private IdemoRepository DemoRepostiory1;


        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, IdemoRepository DemoRepostiory)
        {
            _logger = logger;
            this.DemoRepostiory1 = DemoRepostiory;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            DemoRepostiory1.Insert(new demo { UserName = "明哥富婆" });

            Console.WriteLine($"{DemoRepostiory1.GetHashCode()}");
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

API使用

支援以下2種寫法,根據自身需要選擇其中一種即可,以下所有程式碼查看源碼UnitTest項目

lambda

xxxRepository.Where(f=>f.Id==123);

Linq:

from a in xxxRepository

1、where (條件查詢)

①簡單使用
var order1 = _orderdetailRepository.Entities.Where(f => f.itemid == 123)
              .Select(f => new
              {
                  f.itemid
              })
              .FirstOrDefault();

var order1 = _orderdetailRepository.Filter(f => f.itemid == 123);

排序從小到大
var order1 = _orderdetailRepository.Filter(f => f.orderid == 1, p => p.OrderBy(f => f.Id));

排序從大到小
var order1 = _orderdetailRepository.Filter(f => f.orderid == 1, p => p.OrderByDescending(f => f.Id));

多個欄位排序
var order1 = _orderdetailRepository.Filter(f => f.orderid == 1, p => p.OrderBy(f => f.Id).ThenBy(f=>f.itemid));    

②多個條件
var order1 = _orderdetailRepository.Filter(f => f.itemid == 123 && f.orderid == 1); 

③多個表關聯 
var order1 = from a in _orderdetailRepository.Entities
             join b in _ordermasterRepository.Entities on a.orderid equals b.Id
             select new
             {
                 b.paytime,
                 a.totalprice,
                 a.itemid,
             };

2、select(映射)

①匿名對象
var order1 = _orderdetailRepository.Entities.Where(f => f.itemid == 123)
             .Select(f => new
              {
                  f.itemid
              })
             .FirstOrDefault();

②自定義對象
 public class Test
 {
        public string itemname04 { get; set; }
        public int itemid04 { get; set; }
 }
var order1 = _orderdetailRepository.Entities.Where(f => f.itemid == 123)
             .Select(f => new test
              {
                  f.itemid
              })
             .FirstOrDefault();

3、update (更新)

①簡單更新(不推薦)
var order1 = _orderdetailRepository.FilterWithTracking(f => f.itemid == 123);
order1.totalprice = 30.01M;
var r= _orderdetailRepository.Update(order1);

②sql語法糖更新(強烈推薦)
 var r=_orderdetailRepository.Update(f => f.itemid == 123, f => new Orderdetail
         {
            totalprice = 32.01M
         });    

4、delete (刪除)

① 簡單刪除(不推薦)
var order1 = _orderdetailRepository.FilterWithTracking(f => f.itemid == 9990);
var r = _orderdetailRepository.Delete(order1);

② sql語法糖更新(強烈推薦)
var r = _orderdetailRepository.Delete(f => f.itemid == 9990);

5、insert (插入)

①、簡單插入
var r = _orderdetailRepository.Insert(new Orderdetail
            {
                itemid = 111115,
                itemname = "測試insert",
                totalprice = 111,
                orderid = 1,
            });
            
② 批量插入
var itemId = new Random().Next(100000, 999999);
var list = new List<Orderdetail>();
for (int i = 0; i < 10; i++)
{
    list.Add(new Orderdetail
    {
       itemid = itemId,
       itemname = "測試插入",
       totalprice = 111,
       orderid = 1,
       });
    };
var r = _orderdetailRepository.Insert(list);

6、page分頁 (分頁)

①無條件單表分頁
var page = new PagingInfo
{
     PageIndex = 2, //當前頁
     PageSize = 5,//每頁條數
};
var result = _orderdetailRepository.GetListByPage(page);
var totalCount = result.TotalCount;//返回總頁數 

② 有條件單表分頁
var page = new PagingInfo
{
    PageIndex = 2, //當前頁
    PageSize = 5,//每頁條數
};
var result = _orderdetailRepository.Entities.Where(f => f.Id > 10).Paging(page); 

③ 支援匿名對象分頁
var page = new PagingInfo
{
    PageIndex = 1, //當前頁
    PageSize = 5,//每頁條數
};
var result = _orderdetailRepository.Entities
              .Where(f => f.Id > 10)
              .Select(p => new
                {
                    p.itemid,
                    p.itemname
                })
                .Paging(page);

④ 支援自定義對象分頁
 var page = new PagingInfo
 {
                PageIndex = 1, //當前頁
                PageSize = 5,//每頁條數
 };
var result = _orderdetailRepository.Entities
               .Where(f => f.Id > 10)
                .Select(p => new Test
                {
                    itemid04 = p.itemid,
                    itemname04 = p.itemname
                })
                .Paging(page);  


⑤多表分頁
var page = new PagingInfo
{
                PageIndex = 2, //當前頁
                PageSize = 5,//每頁條數
};
var query = from a in _orderdetailRepository.Entities
            join b in _ordermasterRepository.Entities on a.orderid equals b.Id
            select new
            {
                b.paytime,
                a.totalprice,
                a.itemid,
            };
var result = query.Paging(page);    

問題回饋

可以直接進群回饋:916213430

Tags: