国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ORM核心功能之導(dǎo)航屬性- EFCore和 SqlSugar

這篇具有很好參考價(jià)值的文章主要介紹了ORM核心功能之導(dǎo)航屬性- EFCore和 SqlSugar。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

導(dǎo)航屬性

導(dǎo)航屬性是作為.NET ORM核心功能中的核心,在SqlSugar沒有支持導(dǎo)航屬性前,都說只是一個(gè)高級DbHelper, 經(jīng)過3年的SqlSugar重構(gòu)已經(jīng)擁有了一套

非常成熟的導(dǎo)航屬性體系,本文不是重點(diǎn)講SqlSugar而是重點(diǎn)講導(dǎo)航屬性的作用,讓更多寫Sql人還未使用ORM的人了解到ORM的作用。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-471825.html

1.復(fù)雜的查詢過濾

用戶根據(jù)權(quán)限過濾,用戶根據(jù)組織過濾 等這種多對多情況用SQL就相當(dāng)復(fù)雜 ,例如:用SQL寫一個(gè)多對多過濾就要聯(lián)3個(gè)表(主表 中間表 從表),如果

Where中用到多個(gè)多對多或者嵌套多對多那寫SQL簡直就是惡夢 (一對多和一對一也有提升,沒有多對多明顯)

//EF CORE查詢
var Persons= dbContext.Person //需要定義DbSet才能點(diǎn)出來
.Where(it=>it.Files.Any(y=>y.ChildFiles.Any(s=>s.name=="A"))).ToList()

//SqlSugar 查詢
var Persons= dbContext.Queryable<Person>()
.Where(it=>it.Files.Any(y=>y.ChildFiles.Any(s=>s.name=="A"))).ToList()

用SQL寫如下:

SELECT p.*
FROM Person p
WHERE EXISTS (
  SELECT 1
  FROM PersonFile pf
  INNER JOIN File f ON pf.FileId = f.FileId
  INNER JOIN PersonFile pf2 ON f.FileId = pf2.FileId
  WHERE pf.PersonId = p.PersonId
    AND pf2.PersonId IN (
      SELECT p2.PersonId
      FROM Person p2
      INNER JOIN PersonFile pf3 ON p2.PersonId = pf3.PersonId
      INNER JOIN File f2 ON pf3.FileId = f2.FileId
      WHERE f2.name = 'A'
    )
)

像SAAS系統(tǒng)這種多對多用的非常多,特別在組織、用戶、角色、文件等無處理不在,這也是為什么要用ORM的原因

?

2.復(fù)雜的表單提交

如果您的人事管理需要包含更多的信息,例如學(xué)歷和工作經(jīng)驗(yàn)等字段,您可以在代碼中添加相應(yīng)的實(shí)體和關(guān)聯(lián)。

假設(shè)您有以下實(shí)體:人員(Person)、部門(Department)、職位(Position)、學(xué)歷(Education)和工作經(jīng)驗(yàn)(WorkExperience)。

var person = new Person
{
    // 設(shè)置人員屬性...
    Department = new Department
    {
        // 設(shè)置部門屬性...
    },
    Position = new Position
    {
        // 設(shè)置職位屬性...
    },
    Education = new Education
    {
        // 設(shè)置教育屬性...
    },
    WorkExperience = new WorkExperience
    {
        // 設(shè)置工作經(jīng)歷屬性...
    }
};

代碼如下:

//SqlSugar 導(dǎo)航插入
db.InsertNav(person)
.Include(z1 => z1.Department)  
.Include(z1 => z1.Position) 
.Include(z1 => z1.Education)  
.Include(z1 => z1.WorkExperience)  
.ExecuteCommand();//導(dǎo)航插入 一句就能搞定,先插入主表,然后在根據(jù)主表的主鍵在插入從表,特別是自增列用導(dǎo)航代碼清爽很多

?

3.多層級結(jié)構(gòu)的查詢

因?yàn)镾ql本身就不支持對多層級結(jié)構(gòu)查詢,所以不用ORM想實(shí)現(xiàn)高性能的多層級結(jié)構(gòu)是需要花大量精力去優(yōu)化和寫代碼的

//EF CORE查詢
var Persons= dbContext.Person
.Include(z1 => z1.Department)
.Include(z1 => z1.Position)
.Include(z1 => z1.Education)
.Include(z1 => z1.WorkExperience).ToList()

?

EF Core導(dǎo)航屬性配置

EF多對多

public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    // 其他學(xué)生屬性...

    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    // 其他課程屬性...

    public virtual ICollection<Student> Students { get; set; }
}

public class StudentCourse
{
 public int CourseId { get; set; }
  public int StudentId { get; set; }

}
// 配置多對多關(guān)系 
protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ modelBuilder.Entity<Student>() 
.HasMany(s => s.Courses) 
.WithMany(c => c.Students) .UsingEntity(j => j.ToTable("StudentCourse")); 
}

EF一對多和一對一

public class Department
{
    public int DepartmentId { get; set; }
    public string DepartmentName { get; set; }
    // 其他部門屬性...

    public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee
{
    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    // 其他員工屬性...

    public int DepartmentId { get; set; }
    public virtual Department Department { get; set; }
}

// 配置一對多關(guān)系
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Department>()
        .HasMany(d => d.Employees)
        .WithOne(e => e.Department)
        .HasForeignKey(e => e.DepartmentId);
}

?

SqlSugar導(dǎo)航屬性配置

SqlSugar多對多

//實(shí)體
public class ABMapping1
{
    [SugarColumn(IsPrimaryKey = true)]//中間表可以不是主鍵
    public int AId { get; set; }
    [SugarColumn(IsPrimaryKey = true)]//中間表可以不是主鍵
    public int BId { get; set; }
}
public class A1
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string Name { get; set; }
    [Navigate(typeof(ABMapping1), nameof(ABMapping1.AId), nameof(ABMapping1.BId))]//注意順序
    public List<B1> BList { get; set; }//只能是null不能賦默認(rèn)值
}
public class B1
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string Name { get; set; }
    [Navigat(typeof(ABMapping1), nameof(ABMapping1.BId), nameof(ABMapping1.AId))]//注意順序
    public List<A1> AList { get; set; }//只能是null不能賦默認(rèn)值
}  

?

Sqlugar一對一和一對多

//實(shí)體
public class StudentA
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int StudentId { get; set; }
    public string Name { get; set; }public int SchoolId { get; set; }
    [Navigate(NavigateType.OneToOne, nameof(SchoolId))]//一對一 SchoolId是StudentA類里面的
    public SchoolA SchoolA { get; set; } //不能賦值只能是null
}
public class SchoolA
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id{ get; set; }
    public string SchoolName { get; set; }
   [Navigate(NavigateType.OneToMany, nameof(BookA.studenId))]//一對多 BookA表中的studenId
    public List<BookA> Books { get; set; }//注意禁止給books手動賦值

} 

?

SqlSugar 2023年導(dǎo)航新功能

SqlSugar 第一層自動導(dǎo)航

var list3 = db.Queryable<UnitaStudentA>()
              .IncludesAllFirstLayer().ToList();//有重載可以排除不想要的
               
               //排除說明:
               //IncludesAllFirstLayer(nameof(UnitaStudentA.ProjectPhases)) 
               //這樣就是排除ProjectPhases的導(dǎo)航屬性
               //可以排除多個(gè)
               //IncludesAllFirstLayer("a","b") 
               
//自動導(dǎo)航如果有重復(fù)的情況: 誰在前面執(zhí)行哪個(gè)
var list3 = db.Queryable<UnitaStudentA>()
              .Includes(it=>it.Order.Where(s=>s.id==1).ToList())
              .IncludesAllFirstLayer().ToList();//自動導(dǎo)航和Order重復(fù)
               
//根據(jù)名字導(dǎo)航              
db.Queryable<Order>()
//等同于Includes(it=>it.ProjectPhases)
.IncludesByNameString(nameof(Order.ProjectPhases)).ToList()

SqlSugar第二層半自動

//自動寫法,Books下面的A和B都會查詢出來
.IncludesAllSecondLayer(x=>x.Books)  //自動只能有這么多層次,更深層級需要手動寫法
 
//手動寫法
.Includes(x => x.Books,x=>x.A) 
.Includes(x => x.Books,x=>x.B)

SqlSugar導(dǎo)航DTO轉(zhuǎn)換

在前二年SqlSugar導(dǎo)航只能說夠用,并不算好用,今年重點(diǎn)將導(dǎo)航DTO進(jìn)行了強(qiáng)化

//簡單的用法   5.1.4.71
var list = db.Queryable<Student_004>()
        .Includes(x => x.books)
        .Select(x => new Student_004DTO
           {
             books = x.books 
              
            }, true)//true是自動映射其他屬性,匿名對象需要手動
           .ToList();
                  
                 
//Mapster轉(zhuǎn)換  5.1.4.71
var list = db.Queryable<Student_004>()
        .Includes(x => x.books)
        .Select(x => new Student_004DTO
         {
           name=x.Name,
           books = x.books.Adapt<List<BooksDTO>>() //導(dǎo)航對象用 Mapster轉(zhuǎn)換 (NUGET安裝)
         })
        .ToList();            
 
//DTO中用方法  5.1.4.71
var list = db.Queryable<Student_004>()
         .Includes(x => x.books)
         .Select(x => new Student_004DTO
                 {
                   name=x.Name, 
                   //可以是C#任何方法結(jié)尾
                   bookIds=x.books.Select(it=>it.id).ToList()
                 })
                .ToList();   
 
//聯(lián)表查詢用DTO寫法  5.1.4.71           
var list5= db.Queryable<Student_004>()
           .Includes(x => x.school_001, x => x.rooms)
           .Includes(x => x.books)
           .LeftJoin<Order>((x, y) => x.Id==y.sid)
           .Select((x,y) => new Student_004DTO
           {
               SchoolId = x.SchoolId,
               books = x.books,
               school_001 = x.school_001,
               Name=y.Name
           })
           .ToList();

當(dāng)你遇到繁瑣的數(shù)據(jù)庫操作時(shí),.NET SQLSugar就像是一雙溫暖的手,幫你輕松解決難題。它是一個(gè)強(qiáng)大的工具,讓你的數(shù)據(jù)庫管理變得更簡單、更高效。下載.NET SQLSugar吧,讓它成為你的數(shù)據(jù)之路上的得力助手,讓你的編程之旅充滿感動與喜悅!

原碼下載:?https://github.com/DotNetNext/SqlSugar

?

總結(jié):

.NET中無論是EF CORE還是SQLSUGAR 使用了導(dǎo)航屬性都不再需要費(fèi)心寫繁瑣的SQL語句,只需簡單地調(diào)用導(dǎo)航屬性,便能輕松獲取所需的數(shù)據(jù)。讓我們一起追隨這份感動,選擇使用導(dǎo)航屬性,讓編程的旅途更加愉悅,讓代碼的世界充滿美好與便捷!

?

到了這里,關(guān)于ORM核心功能之導(dǎo)航屬性- EFCore和 SqlSugar的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • .NET ORM 鑒別器 和 TDengine 使用 -SqlSugar

    SqlSugar 是一款 老牌 .NET 開源多庫架構(gòu)ORM框架 ,一套代碼能支持多種數(shù)據(jù)庫像Admin.net、Blog.Core、CoreShop等知名開源項(xiàng)目都采用了SqlSugar作為底層 在不用任何設(shè)計(jì)模式,任何框架的情況下都可以擁有最佳體驗(yàn),SqlSugar做到了保姆一樣的服務(wù),直接用不需要學(xué)習(xí) 的框架,各種默認(rèn)值

    2024年02月14日
    瀏覽(22)
  • c# 實(shí)現(xiàn)sql查詢DataTable數(shù)據(jù)集 對接SqlSugar ORM

    有時(shí)候?qū)τ谝呀?jīng)查詢到的數(shù)據(jù)集,想要進(jìn)行二次篩選或者查詢,還得再查一遍數(shù)據(jù)庫 或者其他的一些邏輯處理不太方便,就想著為什么不能直接使用sql來查詢DataTable呢? 搜索全網(wǎng)沒找到可用方案,所以自己實(shí)現(xiàn)了一個(gè)。 主要實(shí)現(xiàn)思路是使用 SQLite In-Memory Database 內(nèi)存數(shù)據(jù)庫,

    2024年02月12日
    瀏覽(23)
  • NET8 ORM 使用AOT SqlSugar 和  EF Core

    NET8 ORM 使用AOT SqlSugar 和 EF Core

    .Net8的本地預(yù)編機(jī)器碼NET AOT,它幾乎進(jìn)行了100%的自舉。微軟為了擺脫C++的鉗制,做了很多努力。也就是代碼幾乎是用C#重寫,包括了虛擬機(jī),GC,內(nèi)存模型等等。而需要C++做的,也就僅僅是引導(dǎo)程序,本篇通過代碼來看下這段至關(guān)重要的引導(dǎo)程序的運(yùn)作模式。 ? ? ?SqlSugar已經(jīng)

    2024年02月05日
    瀏覽(59)
  • .NET-4.ORM 常見框架EFcorn、Dapper、SqlSugar、FreeSql 和ADO.NET

    .NET-4.ORM 常見框架EFcorn、Dapper、SqlSugar、FreeSql 和ADO.NET

    學(xué)習(xí)參考: 1. .NET 6教程,.Net Core 2022視頻教程,楊中科主講— 以及資料參考 2. 官方文檔EF core 常用的語句 3..netmvc https://www.cnblogs.com/1016391912pm/p/12024671.html https://github.com/dotnet/EntityFramework.Docs/tree/main/samples/core/Querying/Overview 第一個(gè)EFCore應(yīng)用 https://docs.microsoft.com/zh-cn/ef/core/modeli

    2024年02月04日
    瀏覽(22)
  • asp.net core EFCore 屬性配置與DbContext

    Entity Framework (EF) Core 是輕量化、可擴(kuò)展、開源和跨平臺版的常用 Entity Framework 數(shù)據(jù)訪問技術(shù)。用于程序中的class類和數(shù)據(jù)庫中的表互相之間建立映射關(guān)系。在學(xué)習(xí)過程中,EFCore中的屬性配置顯的尤為重要它是學(xué)習(xí)好asp.net core的基礎(chǔ)是配置數(shù)據(jù)庫表結(jié)構(gòu)的重要基石。本篇內(nèi)容為

    2024年02月07日
    瀏覽(95)
  • SqlSugar框架之WPF應(yīng)用端功能介紹

    SqlSugar框架之WPF應(yīng)用端功能介紹

    ?WPF應(yīng)用端是我們《SqlSugar開發(fā)框架》多端界面中的一部分,和Winform前端框架、Vue3+ElementPlus前端、UniApp+Thorn移動端,組成一個(gè)完整的整體框架,后端服務(wù)是基于SqlSugar的基礎(chǔ)ORM的.netcore框架,提供Web API服務(wù)供各個(gè)前端使用,底層支持多種數(shù)據(jù)庫,包括SqlServer、Oracle、Mysql、Po

    2024年02月08日
    瀏覽(17)
  • 采用SqlSugar的DBFirst相關(guān)功能創(chuàng)建數(shù)據(jù)庫表對應(yīng)的實(shí)體類

    采用SqlSugar的DBFirst相關(guān)功能創(chuàng)建數(shù)據(jù)庫表對應(yīng)的實(shí)體類

    ??.NET Core官方教程中推薦使用的EF Core數(shù)據(jù)庫ORM框架雖然能用,但是用起來并不是太方便(或者是不習(xí)慣,之前用的最多的還是linq)。之前下載的開源博客項(xiàng)目中使用的SqlSugar,后者是由果糖大數(shù)據(jù)科技團(tuán)隊(duì)維護(hù)和更新 ,開箱即用最易上手的.NET ORM框架,開源生態(tài)僅次于EF

    2024年02月11日
    瀏覽(20)
  • 基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(30)-- 整合客戶關(guān)系管理系統(tǒng)模塊功能

    基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(30)-- 整合客戶關(guān)系管理系統(tǒng)模塊功能

    以前在隨筆《Winform開發(fā)框架之客戶關(guān)系管理系統(tǒng)(CRM)的開發(fā)總結(jié)系列1-界面功能展示?》的幾篇隨筆中介紹過基于WInform開發(fā)框架開發(fā)的CRM系統(tǒng),系統(tǒng)的功能主要也是圍繞著客戶相關(guān)信息來進(jìn)行管理的,經(jīng)過一些客戶的定制應(yīng)用,以及框架各種功能的完善,系統(tǒng)也已經(jīng)很完善了

    2024年02月07日
    瀏覽(20)
  • .NET 主流 ORM 功能介紹 大全 最新

    ? 下面是3款.NET 使用最多的ORM,來自公眾號投票結(jié)果 ,數(shù)據(jù)比較真實(shí)可靠,也可去搜索公眾號繼續(xù)投票 ?2023年11月投票結(jié)果 測試項(xiàng)目 發(fā)布時(shí)間 微信公眾號投票 (追逐時(shí)間光者) 使用難度 功能 性能 SqlSugar? orm 2014 26%? 491票 適中 全 中高 EFCore? ?orm 2016 36%? 663票 較難 全 中高

    2024年02月05日
    瀏覽(14)
  • Unity核心10——導(dǎo)航尋路系統(tǒng)

    Unity核心10——導(dǎo)航尋路系統(tǒng)

    Unity 中的導(dǎo)航尋路系統(tǒng)是能夠讓我們在游戲世界當(dāng)中,讓角色能夠從一個(gè)起點(diǎn)準(zhǔn)確的到達(dá)另一個(gè)終點(diǎn),并且能夠自動避開兩個(gè)點(diǎn)之間的障礙物選擇最近最合理的路徑進(jìn)行前往 ??Unity?中的導(dǎo)航尋路系統(tǒng)的本質(zhì),就是在 A 星尋路算法的基礎(chǔ)上進(jìn)行了拓展和優(yōu)化 導(dǎo)航網(wǎng)格(NavMes

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包