转:有关SubSonic的新消息

不知园子里有多少人在使用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程序。

 

image

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语句:

 

SELECT [dbo].[Products].[ProductID], [dbo].[Products].[ProductName], [dbo].[Products].[UnitPrice], [dbo].[Products].[SupplierID]
FROM [dbo].[Products]
WHERE [dbo].[Products].[CategoryID] IN (SELECT CategoryID
FROM [Categoryies]
WHERE (CategoryName LIKE @CategoryName
))

 

分页:

List<Product> = new Select("productid", "productname", "unitprice", "SupplierID")
                .From("Products").Paged(2,10).ExecuteTypedList<Product>();

如果是sqlserver2005数据库,就是用ROW_NUMBER()来分页,生成的SQL语句是这样的:

 

SELECT *
FROM     (SELECT ROW_NUMBER() OVER ( ORDER BY productid) AS Row,
[dbo].[Products].[ProductID], [dbo].[Products].[ProductName], [dbo].[Products].[UnitPrice], [dbo].[Products].[SupplierID]
FROM [dbo].[Products]
)
AS PagedResults
WHERE Row >= 20 AND Row < 30

 

怎样,新的查询语法感觉是不是和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为我等懒人所做的一切。

posted @ 2008-09-04 11:26  Jolly-zhang  阅读(396)  评论(0编辑  收藏  举报