有关SubSonic的新消息
2008-02-10 19:37 无常 阅读(11792) 评论(27) 收藏 举报不知园子里有多少人在使用SubSonic,去年7月份开始接触SubSonic,随即在刚启动的新项目中启用,放弃了原计划使用iBATIS.NET 的方案。不是说iBATIS.NET 不好,而是我觉得SubSonic比iBATIS.NET在更胜任短平快的WEB应用,SubSonic比iBATIS.NET省去了一大堆的映射配置文件,在数据库变更时,也无需再去维护烦琐的配置,那个叫省心呀~~~
SubSonic的发起人Rob Conery已经加入了MS ASP.NET team,但他仍然继续着SubSonic的开发,在这个POST中表明"SubSonic is NOT dead"。未来的版本会跟着DotNet的步伐,计划中的3.0版本将向Linq靠拢,这也意味着3.0版本开始只能在DotNet3.5或以上版本的框架中使用了。在此之前,SubSonic还会有一个过渡性的2.1版本,也是最后一个基于DotNet2.0的版本。
现在已经可以在CodePlex上下载SubSonic2.1 Beta版了,这个安装包块头也大了不小(18M)。在安装目录中,发现比2.0版本多了个SubStage程序。
| SubStage主界面 | 
SubStage是SubCommander的GUI版本,在这里可以使用直观的设置来创建SubSonic的配置文件、生成代码等。
我们来看一下2.1版本中查询方法的一些变化:
单表
| Northwind.ProductCollection products = | 
| Northwind.DB.Select().From("Products") | 
| .Where("categoryID").IsEqualTo(5) | 
| .And("productid").IsGreaterThan(50) | 
| .ExecuteAsCollection<Northwind.ProductCollection>(); | 
生成的SQL:
| SELECT [dbo].[Products].[ProductID], [dbo].[Products].[ProductName], [dbo].[Products].[SupplierID], [dbo].[Products].[CategoryID], [dbo].[Products].[QuantityPerUnit], [dbo].[Products].[UnitPrice], [dbo].[Products].[UnitsInStock], [dbo].[Products].[UnitsOnOrder], [dbo].[Products].[ReorderLevel], [dbo].[Products].[Discontinued] | 
| FROM [dbo].[Products] | 
| WHERE [dbo].[Products].[CategoryID] = @CategoryID | 
| AND [dbo].[Products].[ProductID] > @ProductID | 
join
| Northwind.CustomerCollection customersByCategory = new Select() | 
| .From(Northwind.Customer.Schema) | 
| .InnerJoin(Northwind.Order.Schema) | 
| .InnerJoin(Northwind.OrderDetail.OrderIDColumn, Northwind.Order.OrderIDColumn) | 
| .InnerJoin(Northwind.Product.ProductIDColumn, Northwind.OrderDetail.ProductIDColumn) | 
| .Where("CategoryID").IsEqualTo(5) | 
| .ExecuteAsCollection<Northwind.CustomerCollection>(); | 
生成的SQL:
| SELECT [dbo].[Customers].[CustomerID], [dbo].[Customers].[CompanyName], [dbo].[Customers].[ContactName], [dbo].[Customers].[ContactTitle], [dbo].[Customers].[Address], [dbo].[Customers].[City], [dbo].[Customers].[Region], [dbo].[Customers].[PostalCode], [dbo].[Customers].[Country], [dbo].[Customers].[Phone], [dbo].[Customers].[Fax] | 
| FROM [dbo].[Customers] | 
| INNER JOIN [dbo].[Orders] ON [dbo].[Customers].[CustomerID] = [dbo].[Orders].[CustomerID] | 
| INNER JOIN [dbo].[Order Details] ON [dbo].[Orders].[OrderID] = [dbo].[Order Details].[OrderID] | 
| INNER JOIN [dbo].[Products] ON [dbo].[Order Details].[ProductID] = [dbo].[Products].[ProductID] | 
| WHERE CategoryID = @CategoryID | 
此版本已经支持各种join查询(Inner, Outer, Right/Left Inner/Outer, Cross, Unequal),相对于2.0版本来说,这是个很大的改进。
IN
| SqlQuery q = new Select("productid", "productname", "unitprice", "SupplierID") | 
| .From("Products").Where("CategoryID").In( | 
| new Select("CategoryID").From("Categoryies").WhereExpression("CategoryName").Like("A%")); | 
生成的SQL语句:
分页:
| List<Product> = new Select("productid", "productname", "unitprice", "SupplierID") | 
| .From("Products").Paged(2,10).ExecuteTypedList<Product>(); | 
如果是sqlserver2005数据库,就是用ROW_NUMBER()来分页,生成的SQL语句是这样的:
怎样,新的查询语法感觉是不是和Linq很相似。
事务
| List<Insert> queries = new List<Insert>(); | 
| queries.Add(new Insert().Into(Northwind.Region.Schema).Values("test1")); | 
| queries.Add(new Insert().Into(Northwind.Region.Schema).Values("test2")); | 
| queries.Add(new Insert().Into(Northwind.Region.Schema).Values("test3")); | 
| queries.Add(new Insert().Into(Northwind.Region.Schema).Values("test4")); | 
| queries.Add(new Insert().Into(Northwind.Region.Schema).Values("test5")); | 
| queries.Add(new Insert().Into(Northwind.Region.Schema).Values("test6")); | 
| queries.Add(new Insert().Into(Northwind.Region.Schema).Values("test7")); | 
| //execute in a transaction | 
| SqlQuery.ExecuteTransaction(queries); | 
减少对ActiveRecord的依赖
SubSonic以住版本中,BO必须2从ActiveRecord继承。在2.1版本中,BO可以从ActiveRecord继承,也可以从其他任意类继承,例如这样:
| class TestProduct { | 
| private int _id; | 
| public int ProductID { | 
| get { return _id; } | 
| set { _id = value; } | 
| } | 
| private string _name; | 
| public string ProductName { | 
| get { return _name; } | 
| set { _name = value; } | 
| } | 
| private decimal _price; | 
| public decimal UnitPrice { | 
| get { return _price; } | 
| set { _price = value; } | 
| } | 
| } | 
然后在查询语句中这样使用这个类:
| List<TestProduct> result = new | 
| Select("productid","productname","unitprice") | 
| .From(Northwind.Product.Schema) | 
| .ExecuteTypedList<TestProduct>(); | 
如果想修改自动生成的BO继承关系,只需修改配置文件中的tableBaseClass值:
| <add name="NorthwindRepository" type="SubSonic.SqlDataProvider, SubSonic" | 
| connectionStringName="Northwind" | 
| generatedNamespace="NorthwindRepository" | 
| tableBaseClass="MyBaseObject"/> | 
期待正式版发布,感觉Rob Conery为我等懒人所做的一切。
出处: http://wuchang.cnblogs.com
相关链接:
http://blog.wekeroad.com/2008/01/10/subsonic-version-21-pakala-preview-the-new-query-tool/
http://blog.wekeroad.com/2008/01/16/subsonic-21-pakala-preview-part-2/

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号