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 支援磁碟卷的熱插拔機制,包括為執行的虛擬機器新增易失性卷...