无常

记录无常工作上的点点滴滴
posts - 106, comments - 348, trackbacks - 6, articles - 1

有关SubSonic的新消息

Posted on 2008-02-10 19:37 无常 阅读(3933) 评论(18)  编辑 收藏 所属分类: dot netSubSonic

不知园子里有多少人在使用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为我等懒人所做的一切。

出处: 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/

Tag标签: SubSonic

Feedback

#1楼    回复  引用    

2008-02-10 21:35 by 北京SEO [未注册用户]
SubSonic很不错,我一只用它
iBATIS.NET听说代码写的很乱,不知道是不是真的

#2楼    回复  引用    

2008-02-10 22:19 by 台州拉 [未注册用户]
不错 第一见识
下来学习下

#3楼    回复  引用    

2008-02-10 22:22 by 帝之晓00 [未注册用户]
这个我喜欢.正准备在项目中用呢

#4楼    回复  引用  查看    

2008-02-10 23:06 by Leem      
这个跟NBear如何?

#5楼    回复  引用  查看    

2008-02-11 10:57 by 自由、创新、研究、探索……      
SubSonic真的不错,一个非常不错的框架,.NET 的Rails

#6楼 [楼主]   回复  引用  查看    

2008-02-11 12:37 by 无常      
@Leem
抱歉,我没用过NBear
粗略看了下NBear网站上的使用文档,感觉二者的语法有很多相似之处,但似乎SubSonic的语法更精练些。
SubSonic更倾向于WEBFORM应用,而NBear则是win/webform通吃;NB内置有Cache,SS没有。

#7楼    回复  引用  查看    

2008-02-12 01:53 by Jeffrey Zhao      
@自由、创新、研究、探索……
啊?去年我看过Subsonic只涉及到数据访问,现在已经Rails级别的东西了阿?

#8楼    回复  引用    

2008-02-13 09:08 by designbeauty [未注册用户]
subsonic很好很强大,一直在用

#9楼    回复  引用    

2008-02-13 10:33 by 很慌很暴利 [未注册用户]
第一次听说这个,性能比较Ibatisnet怎么样

#10楼    回复  引用    

2008-02-13 17:53 by 努力学习! [未注册用户]
太多东西可选了,眼花缭乱

#11楼    回复  引用  查看    

2008-02-14 08:43 by riancy      
能不能介绍一下SubSonic的层次结构?
能讲讲它的主要特性?

#12楼    回复  引用    

2008-02-14 16:03 by 519virus [未注册用户]
真是一个天好的消息……

#13楼    回复  引用  查看    

2008-02-15 01:43 by KevinLi      
关注subsonic很久了,正准备在项目中使用!

#14楼    回复  引用    

2008-02-15 10:42 by iCaca [未注册用户]
List<Product> = new Select("productid", "productname", "unitprice", "SupplierID")
.From("Products").Paged(2,10).ExecuteTypedList<Product>();


有没有列名和表名的枚举?
直接用string有点傻吧?

#15楼 [楼主]   回复  引用  查看    

2008-02-16 16:05 by 无常      
@iCaca
这个Select是2.3Beta的新语法,现在是没提供有枚举的重载版本
是有点傻了,哈哈
希望正式版会加上

#16楼    回复  引用  查看    

2008-03-04 16:35 by Ψιζσεα.      
Northwind.DB.Select().From(Northwind.Employee.Schema)

Northwind.DB.Select().From(Northwind.Tables.Employee)

Northwind.Employee.Columns.BirthDate

我发现可以这么些~

但是Columns , Tables 都是结构..
如果可以循环遍历其中的元素的到对应的value就好了~

#17楼    回复  引用    

2008-05-29 16:22 by 马敬远 [未注册用户]
我在一个网站中使用了这个东西,但我对subsonic并不是很熟,以致于在我机器上调试完全没有问题的网站,上传到虚拟主机上就出现 select master权限的错误,经老师指点是subsonic要读取数据库架构,我想请教博主-无常,能够让subsonic不读取数据库架构吗?该怎么做哪?

#18楼 [楼主]   回复  引用  查看    

2008-06-05 08:46 by 无常      
@马敬远
不是很明白你程序的出错原因,subsonic是不需要访问master数据库的权限的~

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-08 20:35 编辑过


相关链接: