11

dapperの操作について2つの質問があります。

  1. entity-framework(lazy-loading)のようなナビゲーションキープロパティをロードする方法はありますか?

  2. POCO serializationとの違いは何dynamic serializationですか?どちらがいいですか?このシリアル化をどのように使用できますか?

4

4 に答える 4

10

entity-framework(lazy-loading)のようなナビゲーションキープロパティをロードする方法はありますか?

いいえ、Dapperは直接SQLライブラリであるため、非常に高速です。自動読み込みを取り巻くオーバーヘッドはありません。ただし、一度に複数のエンティティをロードできます。

POCOシリアル化と動的シリアル化の違いは何ですか?どちらがいいですか?このシリアル化をどのように使用できますか?

POCOシリアル化は、コンパイル時に型がよく知られているため、より効率的です。動的シリアル化は、実行時に評価する必要があるため、少しコストがかかります。それ以外は、実際には違いはありません。

ただし、他のすべてのライブラリよりもDapperをお勧めします。シンプル、高速、そして非常に柔軟です。そして私を信じてください、私はデータアクセスのために多くのフレームワークとライブラリを使用しました。

Dapperドキュメント

マルチマッピング複数の結果をご覧ください

于 2012-12-19T16:21:12.867 に答える
8

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);
于 2012-12-19T16:23:17.853 に答える
1

私の知る限りLazy<T>、.NETのクラスを使用して何かを手作りしない限り、dapperでの遅延読み込みのサポートはありません。

POCOシリアル化は、クラスを定義する場所であり、このインスタンスを使用して、テーブルから行を追加/編集/読み取ります。

動的シリアル化はdynamic、.NET(クラスを定義しない)でオブジェクトを使用する場所です。

知性や型安全性はありませんが、ダイナミックはより早く動き始めます。POCOの設定には少し時間がかかりますが(使用する各クラスを作成する必要があるため)、型の安全性とインテリジェント性を維持します。

于 2012-12-19T16:23:16.810 に答える
0

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>それは他の方法で行うことができます

于 2020-01-23T13:22:25.500 に答える