簡體   English   中英

在 dapper 中可以延遲加載嗎? 泛型 (POCO) 和動態 API 之間有什么區別?

[英]Is lazy loading possible in dapper? And what is the difference between the generic (POCO) and dynamic API?

我有兩個關於使用 dapper 的問題:

  1. 有沒有辦法加載導航鍵屬性,如實體框架(延遲加載)?

  2. POCO serializationdynamic serialization什么區別? 哪個更好? 以及如何使用此序列化?

有沒有辦法加載導航鍵屬性,如實體框架(延遲加載)?

不,Dapper 是一個直接 SQL 庫,這就是為什么它的速度如此之快。 沒有圍繞自動加載的開銷。 但是,您可以一次加載多個實體。

POCO 序列化和動態序列化有什么區別? 哪個更好? 我如何使用這個序列化?

POCO 序列化更有效,因為類型在編譯時是眾所周知的,動態序列化更昂貴,因為它必須在運行時進行評估。 除此之外沒有真正的區別。

但是,我會推薦 Dapper,而不是任何地方的所有其他庫。 它簡單、快速且極其靈活。 相信我,我已經使用了很多框架和庫來訪問數據。

小巧的文檔

看看多映射多結果

1:沒有; 根本沒有,除非你完全自己滾動。 它是有意的簡約和確定性

2:如果您想將該數據公開給應用程序的其他部分,例如作為視圖模型的數據,那么實現 POCO 會很方便; 例如, Query<Customer>可以填充眾所周知的Customer對象,您可以在其他地方對其進行編碼。 dynamic非常方便,但不是很容易探索- 並且不適用於數據綁定或智能感知。 然而,對於仍然非常本地化的 DAL 方法,或者例如

var row = conn.Query("select qty, cost from parts where id = @id",
    new { id }).Single();
int qty = row.qty;
decimal cost = row.cost;
// and off we go...

要么:

var lookup = conn.Query("select id, name from somelookup").ToDictionary(
      x => (int)x.id, x => (string)x.name);

據我所知,除非您使用 .NET 中的Lazy<T>類手工制作一些東西,否則 dapper 中沒有延遲加載支持。

POCO 序列化是您定義類的地方,它的實例用於從表中添加/編輯/讀取行。

動態序列化是您在 .NET 中使用dynamic對象的地方(您不定義類)。

盡管您沒有智能感知或類型安全,但動態將更快地開始。 POCO 將需要更長的時間來設置(因為您需要創建您想要使用的每個類),但您會保持類型安全和智能感知。

使用 Dapper 為延遲加載提供另一個選項是 Castle 的動態代理。 我已經成功地使用 Dapper、Dynamic Proxy 和 Mediatr 編寫了一個 POC 框架,以在訪問時啟用對屬性的延遲加載,即

例如

public class Customer
{
    public IEnumerable<Order> Orders { get; set; }
}

public class Order
{
    public IEnumerable<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    /*
     * ...
     */
}

然后當你像這樣使用時:

Customer customer = ... /*Load from database*/
/* Perform some logic */
// Access "Orders"

foreach(Order order in customer.Orders)//loads orders from the database
{
    foreach(OrderLine in order.OrderLines) //loads order lines from the database
    {
    }
}

所以你不必只使用Lazy<T>它可以通過其他方式完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM