目錄
- [LINQ2Dapper]最完整Dapper To Linq框架(一)---基礎查詢
- [LINQ2Dapper]最完整Dapper To Linq框架(二)---動態化查詢
- [LINQ2Dapper]最完整Dapper To Linq框架(三)---實體類關系映射
- [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL並行使用
- [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq實際執行的SQL
- [LINQ2Dapper]最完整Dapper To Linq框架(六)---多表聯合與匿名類型返回
- [LINQ2Dapper]最完整Dapper To Linq框架(七)---倉儲模式
- [LINQ2Dapper]最完整Dapper To Linq框架(八)---導航屬性
3.1.9.4版本增加新功能導航屬性
1.安裝
可在Nuget上搜索最新版本(目前是預覽版本,只能通過Nuget命令安裝)
或者使用Nuget命令
Install-Package Kogel.Dapper.Extension.Mssql
(此模式不建議正式項目使用)
2.定義
使用特性ForeignKey定義主外鍵關系
[Display(Rename = "News")] public class News:IBaseEntity<News,int> { /// <summary> /// 新聞主鍵 /// </summary> [Identity] public override int Id { get; set; } /// <summary> /// 內容 /// </summary> public string Content { get; set; } /// <summary> /// 評論列表 /// </summary> [ForeignKey("Id", "ArticleId")] public List<Comment2> Comments { get; set; } }
[Display(Rename = "Comment")] public class Comment : IBaseEntity<Comment,int> { [Identity] public override int Id { get; set; } /// <summary> /// 新聞id /// </summary> public int ArticleId { get; set; } /// <summary> /// 評論內容 /// </summary> public string Content { get; set; } }
注意:用到導航屬性的實體類需要繼承IBaseEntity,最好所有實體類都繼承IBaseEntity
(在沒有用到導航屬性時,導航屬性不會起任何作用,查詢時也不會返回導航屬性數據)
使用導航屬性進行條件判斷查詢
var comment = conn.QuerySet<News1>() .Where(x => x.Comments.Any(y => y.Id != 10)) .ToList();
查詢導航屬性的數據,並使用Select
var comment11 = conn.QuerySet<News>() .Where(x => x.Comments.Any(y => y.Id != 10)) .Get(x => new NewsDto1 { Id = x.Id, Title = x.Content, CommentDto1 = x.Comments.Select(y => new CommentDto1() { Id = y.Id, Content = y.Content }).ToList() });
自定義返回的Dto類需要繼承IBaseEntity接口
//需要繼承IBaseEntity接口 public class CommentDto1:IBaseEntityDto { public int Id { get; set; } public string Content { get; set; } }
3. 1對1導航關系
public class Comment : IBaseEntity<Comment,int> { [Identity] public override int Id { get; set; } /// <summary> /// 內容 /// </summary> public string Content { get; set; } /// <summary> /// 新聞id /// </summary> public int ArticleId { get; set; } //一條評論對應一條新聞 [ForeignKey("ArticleId","Id")] public News News { get; set; } }
1對1使用導航屬性查詢
var comment = conn.QuerySet<Comment>() .Where(x => x.News.Id == 1) .Get();
4.關於導航屬性的性能
導航屬性的實現是基於1對多或多對多直接關系的連表然后查詢出所有主從結果,再利用“回溯二叉樹算法”分割數據對應實體之間的關系進行實現
回溯法有通用解法的美稱,實際上是一個類似枚舉的深度優先收索參試過程,主要是在收索參試過程中尋找問題的解,當發現已不滿足求解條件時就回溯返回也就是遞歸返回,參試別的路徑。就是窮舉法。
要解決一個回溯問題通常要確定三個元素:
1.選擇:對於每一個特定的解,肯定是由一步步構建而來的,而每一步怎么構建,肯定都是有限個選擇要怎么選擇這個要知道在編程的時候就要定下優先或合法的每一步選擇的順序。
2.條件。對於每一個特定的解的某一步,他必然要符和某個解的特定要求,如果不符合條件,就要回溯。
3.結束。當到達一個特定結束條件的時候,就認為這個一步步構建的解是符合的解了
對於回溯法來說每次遞歸調用很重要的一點就是把每次遞歸的不同信息傳遞給遞歸調用的函數,最重要的就是把上一步做過的某些事情的這個選擇排除避免重復和無限遞歸。
遞歸函數參數的選擇需要遵循四個原則:
1.必須有一個臨時變量因為每一步選擇后暫時還沒有構成完整的解,這個時候這個選擇的不完整的解,也要想辦法傳遞給遞歸函數,也就是,把每次遞歸的不同情況傳遞給遞歸調用的函數
2.最重要的是在參數設計中可以得到結束條件。
3.要保證遞歸函數返回時,狀態可以恢復到遞歸前。
框架開源,完整框架源碼可以去Github上下載:
https://github.com/a935368322/Kogel.Dapper.Extension
如有問題也可以加QQ群討論:
技術群 710217654