Spiga

有关SubSonic的新消息

2008-02-10 19:37 by 无常, 9992 visits, 收藏, 编辑

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

标签: SubSonic
Add your comment

27 条回复

  1. #1楼 北京SEO[未注册用户]2008-02-10 21:35
    SubSonic很不错,我一只用它
    iBATIS.NET听说代码写的很乱,不知道是不是真的
     回复 引用   
  2. #2楼 台州拉[未注册用户]2008-02-10 22:19
    不错 第一见识
    下来学习下
     回复 引用   
  3. #3楼 帝之晓00[未注册用户]2008-02-10 22:22
    这个我喜欢.正准备在项目中用呢
     回复 引用   
  4. #4楼 Leem      2008-02-10 23:06
    这个跟NBear如何?
     回复 引用 查看   
  5. #5楼 自由、创新、研究、探索……      2008-02-11 10:57
    SubSonic真的不错,一个非常不错的框架,.NET 的Rails
     回复 引用 查看   
  6. #6楼[楼主] 无常      2008-02-11 12:37
    @Leem
    抱歉,我没用过NBear
    粗略看了下NBear网站上的使用文档,感觉二者的语法有很多相似之处,但似乎SubSonic的语法更精练些。
    SubSonic更倾向于WEBFORM应用,而NBear则是win/webform通吃;NB内置有Cache,SS没有。
     回复 引用 查看   
  7. #7楼 Jeffrey Zhao      2008-02-12 01:53
    @自由、创新、研究、探索……
    啊?去年我看过Subsonic只涉及到数据访问,现在已经Rails级别的东西了阿?
     回复 引用 查看   
  8. #8楼 designbeauty[未注册用户]2008-02-13 09:08
    subsonic很好很强大,一直在用
     回复 引用   
  9. #9楼 很慌很暴利[未注册用户]2008-02-13 10:33
    第一次听说这个,性能比较Ibatisnet怎么样
     回复 引用   
  10. #10楼 努力学习![未注册用户]2008-02-13 17:53
    太多东西可选了,眼花缭乱
     回复 引用   
  11. #11楼 riancy      2008-02-14 08:43
    能不能介绍一下SubSonic的层次结构?
    能讲讲它的主要特性?
     回复 引用 查看   
  12. #12楼 519virus[未注册用户]2008-02-14 16:03
    真是一个天好的消息……
     回复 引用   
  13. #13楼 KevinLi      2008-02-15 01:43
    关注subsonic很久了,正准备在项目中使用!
     回复 引用 查看   
  14. #14楼 iCaca[未注册用户]2008-02-15 10:42
    List<Product> = new Select("productid", "productname", "unitprice", "SupplierID")
    .From("Products").Paged(2,10).ExecuteTypedList<Product>();


    有没有列名和表名的枚举?
    直接用string有点傻吧?
     回复 引用   
  15. #15楼[楼主] 无常      2008-02-16 16:05
    @iCaca
    这个Select是2.3Beta的新语法,现在是没提供有枚举的重载版本
    是有点傻了,哈哈
    希望正式版会加上
     回复 引用 查看   
  16. #16楼 Ψιζσεα.      2008-03-04 16:35
    Northwind.DB.Select().From(Northwind.Employee.Schema)

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

    Northwind.Employee.Columns.BirthDate

    我发现可以这么些~

    但是Columns , Tables 都是结构..
    如果可以循环遍历其中的元素的到对应的value就好了~
     回复 引用 查看   
  17. #17楼 马敬远[未注册用户]2008-05-29 16:22
    我在一个网站中使用了这个东西,但我对subsonic并不是很熟,以致于在我机器上调试完全没有问题的网站,上传到虚拟主机上就出现 select master权限的错误,经老师指点是subsonic要读取数据库架构,我想请教博主-无常,能够让subsonic不读取数据库架构吗?该怎么做哪?
     回复 引用   
  18. #18楼[楼主] 无常      2008-06-05 08:46
    @马敬远
    不是很明白你程序的出错原因,subsonic是不需要访问master数据库的权限的~
     回复 引用 查看   
  19. #19楼 James.Chen[未注册用户]2008-12-06 22:44
    最近接触了 Subsonic,我感觉这就是我一直在寻找的东西。以前也接触过其他的一些ORM, 但我觉得 Subsonic在易用性方面更好,和我现在的项目可以很好的整合,比如:如果表中存在字段CreatedBy或者ModifiedBy,则会自动更新用户名到该字段中。如果表中存在字段CreatedOn或者ModifiedOn,则会自动更新当前日期到该字段中。如果表中存在字段Deleted,则调用删除方法时,会自动将该列设置为1。作者很会做产品,从提供的可视化代码生成器到 IDE集成,Subsonic不仅是一个ORM框架,更是一个解决方案。最近在论坛上听见个某个人说 Rob Conery 技术不怎么样,我感觉说这话的人是个脑残。首先撇开Rob本人的技术怎样不谈,光凭能做出这么一个好用的产品就这值得我们称道。纯搞技术,那是自娱自乐,nhibernate 技术是很 NB,但对于大部分的中小型项目未必适合,光是 XML配置就搞死人,数据库结构变动更要命,虽然有 CodeSmith、mygeneration模板,但各有优缺点,不尽人意,远远没有Subsonic 提供的生成器好用。
     回复 引用   
  20. #20楼 深圳阿莫      2009-02-11 23:50
    这里有SubSonic的视频教程,国人讲解的,希望能帮到初学者。
    http://501000.cn/space-1-do-thread-id-16.html

    这地址是视频地址,可以直接打开:http://501000.cn/swf/001a.html
     回复 引用 查看   
  21. #21楼 黑太郎      2010-09-01 18:22
    问一个问题
    如果subsonic链表查询中
    两张表有相同的字段名
    你怎么取别名的,谢谢!
     回复 引用 查看   
  22. #22楼 秋叶抚风      2010-12-30 23:25
    SubSonic使用中,但发现好像用的人不多了?
     回复 引用 查看   
  23. #23楼 微生物      2011-03-01 14:13
    GOOD
     回复 引用 查看   
  24. #24楼 深蓝医生      2011-04-14 18:47
    PDF.NET数据开发框架也是一个很好用的框架,它操作实体类不需要输入字段名的:
    User user=new User();
    user.Age=20;
    //查询年龄等于20的用户记录
    OQL q=OQL.From(user).Select(user.ID,user.Name).Where(user.Age);
     回复 引用 查看   
  25. #25楼 兰色★毒药      2011-12-01 10:06
    问下楼主,subsonic中如何查看生成的sql语句啊??
     回复 引用 查看   
  26. #26楼[楼主] 无常      2011-12-01 11:20
    @兰色★毒药
    SqlQuery query = new SqlQuery(new Product());
    string sql= query.And("ProductName").Like("test")
    .AndExpression("ProductID").IsEqualTo(10)
    .CloseExpression()
    .SelectStatement;

    就可以得到sql语句了。
     回复 引用 查看   
  27. #27楼 小龙3      2011-12-20 20:15
    请教:subsonic 2.2 如果保存运行过的SQL日志?
        <SubSonicService defaultProvider="ItemMasterProvider" enableTrace="true" templateDirectory=""> <providers> <clear/> <add name="ItemMasterProvider" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="U9ItemMasterConnectString" generatedNamespace="SubSonic.Generated.U9ItemMaster"/> <!--<add name="U9Provider" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="U9ConnectString" generatedNamespace="SubSonic.Generated.U9" includeProcedureList="" includeTableList=""/>--> </providers> </SubSonicService>
    
    


    是不是enableTrace="true" 这样就可以了? 记录保存在哪里??
     回复 引用 查看   
Locations of visitors to this page