延迟加载是否可能在精致?通用(POCO)和动态API有什么区别?

时间:2012-12-19 16:18:15

标签: c# dapper

我有两个关于使用小巧玲珑的问题:

  1. 有没有办法加载像entity-framework这样的导航键属性(延迟加载)?

  2. POCO serializationdynamic serialization之间有什么区别? 哪个更好?以及如何使用此序列化?

4 个答案:

答案 0 :(得分:12)

  

有没有办法加载导航键属性,如实体框架(延迟加载)?

不,Dapper是一个直接的SQL库,这就是为什么它如此荒谬快速。自动装载没有任何开销。但是,您可以一次加载多个实体。

  

POCO序列化与动态序列化有什么区别?哪个更好?以及如何使用此序列化?

POCO序列化更有效,因为该类型在编译时是众所周知的,动态序列化有点贵,因为它必须在运行时进行评估。除此之外没有什么区别。

但是,我会在任何地方的 所有其他 库之上推荐Dapper。它简单,快速,非常灵活。相信我,我已经使用了很多框架和库来进行数据访问。

Dapper Documentation

查看多重映射多重结果

答案 1 :(得分:9)

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);

答案 2 :(得分:2)

据我所知,除非你在.NET中使用Lazy<T>类手工制作东西,否则dapper中没有延迟加载支持。

POCO序列化是您定义类的地方,其实例用于从表中添加/编辑/读取行。

动态序列化是您在.NET中使用dynamic对象的地方(您不在其中定义类)。

动态将更快开始,虽然你没有智能感或类型安全性。 POCO需要更长的时间来设置(因为你需要创建你想要使用的每个类),但你保持类型安全和智能感知。

答案 3 :(得分:1)

Castle的动态代理为使用Dapper进行延迟加载提供了另一个选择。我已经成功地使用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>即可通过其他方式完成