FreeSql 新功能介紹 貪婪載入五種方法

2021-09-22 19:35:29 字數 3368 閱讀 9791

freesql 在經過6個月的開發和朋友們的工作實踐,不斷的改進創新,目前擁有1500個左右單元測試方法,且每個方法內又覆蓋不同的測試面。

今天介紹 freesql 各種貪婪載入的姿勢,作下總結。本節內容對應的還有【延時載入】,貪婪載入和他本該在一起介紹,開發專案的過程中應該雙管齊下,才能寫出高質量的程式。有關延時載入,日後有空再單獨編寫。

freesql是乙個功能強大的netstandard庫,用於物件關係對映程式(o/rm),便於開發人員能夠使用 .netstandard 物件來處理資料庫,不必經常編寫大部分資料訪問**。

select

<

tag>()

.limit(10

).tolist

(a =

>

newtestdto);

select

<

tag>()

.limit(10

).tolist

(a =

>

newtestdto()

);select

<

tag>()

.limit(10

).tolist

(a =

>

newtestdto);

select

<

tag>()

.limit(10

).tolist

(a =

>

newtestdto()

);select

<

tag>()

.limit(10

).tolist

<

testdto

>()

;

像這種對映支援單錶/多表。

查詢規則,查詢屬性名,會迴圈內部物件 _tables(join 查詢後會增長),以 主表優先查,直到查到相同的字段。

如:a, b, c 都有 id,dto ,a.id 被對映。也可以指定 id = c.id 對映。

還可以在 dto 可以直接對映乙個導航屬性。

對頭,通過對映某物件,也可以實現貪婪載入,這個功能是在資料庫查詢前對映的,而不是查回所有資料再重組。

manytoone/onetoone 導航屬性通過 tolist() 載入,這個方法有乙個引數:includenestedmembers。

引數說明:

false: 返回 2級 join 的資料;

true: 返回所有層級深度 join 的導航資料;

如果查詢中已經使用了 a.parent.parent 類似表示式,則可以無需 leftjoin 等操作。

如:

class

tagpublic

string name

public

int? parent_id

public

virtual

tag parent

}select

<

tag>()

.where

(a =

> a.parent.name ==

"1")

.tolist()

;//這樣寫,不需要再標記 join,解析表示式時自動處理成 leftjoin

如果導航屬性沒有使用,又想載入,可使用 include 方法。(不好理解可跳過,也許只能在使用中體會)

select

<

tag>()

.include

(a =

> a.parent)

.tolist()

;

includemany 貪婪載入集合的導航屬性,其實是分兩次查詢,在 tolist 後進行了資料重灌。

class

song

public

string title

public

virtual icollection tags

}class

song_tag

public

virtual

song song

public

int tag_id

public

virtual

tag tag

}select

<

tag>()

.includemany

(a =

> a.songs)

.tolist()

;//這是 manytomany 關係的貪婪載入

includemany 有第二個引數,可以進行第二次查詢前的修飾工作。

select

<

tag>()

.includemany

(a =

> a.songs,

then =

> then.

where

(song =

> song.user ==

"admin"))

.tolist()

;

然後,其實在 then 那裡,還可以繼續進行向下 include/includemany。只要你喜歡,向下 100 層都沒問題。

大體與 manytomany 用法相同,只是它沒有通過中間表查詢資料。

變異的 includemany,即使選擇的不是導航屬性,也可以貪婪載入。適合一些些老專案,導航屬性配置不規則的,也可以一對多貪婪載入。

為了方便理解,我建立了下面兩個類,他們沒有配置導航關係。你可能會問為啥不配置?我這樣是為了直觀理解、這樣是為了直觀理解、這樣是為了直觀理解!!

class

order

public

string ***

public list details

}class

orderdetail

public

string detailtestfield

public

guid orderid

}select

<

order

>()

.includemany

(a =

> a.details.

where

(b =

> b.orderid == a.id)).

tolist()

;

ok,這樣查詢 order 時,會把 details 也查詢回來。

我們有考慮在 then 那裡實現 limit(5) 功能,場景是只查詢每個子記錄的前5條回來(待實現)。

感謝一直支援的朋友們!

Flash Lite 2 0 新功能介紹

flash lite 2.0 新功能介紹 以下是 flash lite 2.0 支援的新功能.3,解析外部xml 可使用flash 7 mx2004 的xml物件,訪問和解析外部xml檔案.4,本地資料訪問 可以在手機上儲存檔案了,即使用本地共享物件 sharedobject 5,載入外部和聲音 從...

redis 4 0新功能介紹

阿里雲redis4.0引擎是以社群4.0為基礎,合入大量阿里雲開發的特性以及bugfix後全新推出的售賣版本。除了擁有redis 2.8引擎所具備的所有優勢之外,還帶來了很多新功能。redis 4.0帶來的lazyfree機制可以避免del,flushdb flushall,rename等命令引起的...

OpenNebula 3 6 新功能介紹

opennebula 3.6 主要是穩固了3.4引進的一些特點,優化了前面版本一些特點的效能,同時增加了新的虛擬化管理和與新的opennebula marketplace整合的特點。opennebula 3.6比較新引人的新特性可以歸納為 1 支援磁碟卷的熱插拔機制,包括為執行的虛擬機器新增易失性卷...