首页 / 网页编程 / ASP.NET / 微型ORM——用VB和C#编写的动态类型ORM,只有160行
        
            微型ORM——用VB和C#编写的动态类型ORM,只有160行2011-08-06 infoq 译:侯伯薇近来ORM变得越来越普遍,这都归于一种很具说服力的原因;它可以使开发数据库驱动的应用程序变得 更快、更省力。但是ORM框架都有点“固执己见”,他们期望开发者遵从特定的规则,当规则被打破的时 候就非常难以使用。最通常的规则之一就是,存储过程必须总是返回单独的结果集,其中带有一致的列的 列表。不幸的是,有很多这样的存储过程,其中返回的数据的结果根据它自身内部逻辑的不同而不同。例 如,一个存储过程可能会接受一个参数,它表示要返回那些列,而另一个参数表示如果它包含了所有行, 那么就对其进行合计。或者存储过程的结果可能会根据某些内部的标识而不同,从而应用程序需要检查输 出,从而在运行时决定结构。面对已经确定了的存储过程集合,而这些存储过程并非是针对ORM系统所基于的静态建模的类型所设计 的,大多数.NET开发者会转而使用DataTable的方法。但是有了.NET 4.0中新创建的对动态类型的支持, 他们会产生另一个主意。如果所有一切——包括存储过程的名称、SQL的参数以及得到的对象——都在运 行时处理会怎么样呢?下面是一些由VB和C#编写的示例代码。你会注意到VB需要使用Option Strict,而C#大量地使用了它的 新关键字“dynamic”。VBUsing con As New SqlClient.SqlConnection(connectionString)
     Dim customer = con.CallSingleProc.CustomerSelect(AccountKey:=12345)
     Console.WriteLine(customer.FirstName & " " & customer.LastName) 
     Dim orders As IList = con.CallListProc.OrderSearch(AccountKey:=12345,  MinCreatedDate:=Now.AddDays(-7), MaxCreatedDate:=Now)
     Dim totalValue = Aggregate order In orders Into Sum(CDec (order.TotalOrderValue))
     Console.WriteLine("This customer ordered a total of $" & totalValue  & " last week")
     For Each order In orders
         Console.WriteLine(vbTab & "Order Key: " & order.OrderKey  & " Value: $" & order.TotalOrderValue)
     Next
End UsingC#using (var con = new SqlConnection(connectionString))
{
     var customer = con.CallSingleProc().CustomerSelect(AccountKey: 12345);
     Console.WriteLine(customer.FirstName + " " + customer.LastName);
     IList<dynamic> orders = con.CallListProc().OrderSearch(AccountKey:  12345, MinCreatedDate: DateTime.Now.AddDays(-7), MaxCreatedDate: DateTime.Now);
     var totalValue = orders.Sum(order => (decimal) order.TotalOrderValue);
     Console.WriteLine("This customer ordered a total of $" + totalValue + "  last week");
     foreach (var order in orders)
     {
         Console.WriteLine("	Order Key: " + order.OrderKey + " Value: $"  + order.TotalOrderValue);
     }
}