数据库组件 Hxj.Data (二十八)

数据库组件 Hxj.Data (二十八)(事务中的查询,查询字段字中的子查询,WhereClip的隐式转换)

本节讲述新版本中新加的功能,以及如何使用。

事务中的查询

应用场景,有时我们需要事务更新、添加、删除表的操作,在提交事务又需要对这些进行查询(不想 降低事务级别让其他连接查询事务中的数据变动),在事务内部进行的查询。

其实只是在DbTrans中增加了FromSection方法。

示例代码如下:

using (DbTrans trans = DbSession.Default.BeginTransaction())
{
//修改了第一条记录
trans.Update<Products>(Products._.ProductName, "productname", Products._.ProductID == 1);
//事务内查询
Products product = trans.From<Products>().ToFirst();
trans.Commit();
}

使用的时候和普通查询时一模一样的。

查询字段中的子查询

应用场景,在查询中需要在结果中有一列是通过子查询获取的。

例如sql:select customerid,customername,(select count(*) from order where order.customerid=customer.customerid) as ordercount from customer

在FromSection查询中增加了AddSelect方法,

AddSelect(FromSection fromSection)

AddSelect(FromSection fromSection, string aliasName)

第二个参数为该子查询后的别名,不然则没有别名。

示例代码如下:

DbSession.Default.From<Customers>()
.Select(Customers._.CustomerID, Customers._.ContactName)
.AddSelect(DbSession.Default.From<Orders>().Select(Field.All.Count()).Where (Customers._.CustomerID == Orders._.CustomerID), "ordercount")
.Page(10, 6)
.ToDataTable();

生成的sql语句:

Text: SELECT TOP 10 * FROM
( SELECT TOP 41 [Customers].[CustomerID],[Customers].[ContactName],
( SELECT count(*) AS [cnt] FROM [Orders] WHERE ([Customers].[CustomerID] = [Orders]. [CustomerID]) ) AS [ordercount]
FROM [Customers] ORDER BY [Customers].[CustomerID] DESC ) AS tempIntable
ORDER BY [CustomerID] ASC

时间: 2024-09-28 22:38:19

数据库组件 Hxj.Data (二十八)的相关文章

数据库组件 Hxj.Data (十八) (批处理)

批处理就是提交的脚本不是马上执行,而是到一定数量才提交. 还是先上例子 using (DbBatch batch = DbSession.Default.BeginBatchConnection()) { batch.Update<Products>(Products._.ProductName, "apple", Products._.ProductID == 1); batch.Update<Products>(Products._.ProductName,

数据库组件 Hxj.Data (十九) (事务二)

对事务有进行了更新,又得去下载一下新版本,对上一版本兼容,扩充了DbTrans方法. 相比十七节(事务)中的事务写法简洁了一些.如下 using (DbTrans trans = DbSession.Default.BeginTransaction()) { trans.Update<Products>(Products._.ProductName, "apple", Products._.ProductID == 1); trans.Update<Products&

数据库组件 Hxj.Data (十二) (模糊查询、简单的in,not in查询)

条件的生成都是通过对表中字段进行的. 比如: Products._.UnitPrice > 1 Products._.CategoryID == 2 这些是简单的比较. 下面来介绍通过like 模糊查询该怎么做. 先上代码, Products._.ProductName.Contain("apple") 这句等效sql就是(sqlserver) productname like '%apple%' 就是完全模糊搜索. Products._.ProductName.BeginWit

数据库组件 Hxj.Data (十六) (查询的字段)

在查询没有设置查询字段,组件默认是返回所有字段信息,即select * from table 那在查询中如何设置需要返回的字段信息呢? 在之前几节中的例子已经存在设置查询字段,是通过 select方法来设置的. 先上例子: DbSession.Default.From<Products>() .Select(Products._.ProductID, Products._.ProductName) .ToDataTable(); 这里是设置查询只返回productid和productname两

数据库组件 Hxj.Data (十五) (查询的排序、分组)

本节将讲述查询的排序(order by) 和 分组(group by). 先说排序 在分页中如果没有指定排序,组件会默认一个排序来实现分页. 例如 DbSession.Default.From<Products>() .Page(10, 2) .Where(Products._.CategoryID.SelectIn(1, 2, 3)) .ToList(); 生成的sql如下: Text: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20

数据库组件 Hxj.Data (十) (输出组件执行的sql)

前面有TX留言问分页的sql是怎么样的,看完这篇你也就知道了. 组件可以输出执行的sql,方便查看sql生成的语句是否有问题. 通过注册事件来输出sql DbSession.Default.RegisterSqlLogger(database_OnLog); private string sql; void database_OnLog(string logMsg) { //保存执行的DbCommand (sql语句和参数) sql += "<br />" + logMsg

数据库组件 Hxj.Data (十四) (联合查询)

联合查询在前面的例子中已经出现过,只不过没有细说. 先来个例子吧 DbSession.Default.From<Customers>() .InnerJoin<Orders>(Customers._.CustomerID == Orders._.CustomerID) .ToDataTable(); 生成的sql Text: SELECT * FROM [Customers] INNER JOIN [Orders] ON ([Customers].[CustomerID] = [O

数据库组件 Hxj.Data (二十五)(数据库连接配置

本节补充讲述connectionStrings的设置. 组件读取connectionStrings节点的配置的时候会根据providerName来判断是哪个数据库. 数据库 providerName Sql server 2000 1.System.Data.SqlClient 2.Hxj.Data.SqlServer Sql server 2005 Hxj.Data.SqlServer9 MS Access Hxj.Data.MsAccess Sqlite 1.System.Data.SQLi

数据库组件 Hxj.Data (二十四)(Sqlite数据库)

Hxj.Data(V1.3)组件增加了对Sqlite数据库的支持. 以及实体生成工具也同时发布(V1.3)版本支持Sqlite数据库的实体生成. 使用Sqlite数据库开发,需要引用Hxj.Data.Hxj.Data.Sqlite.System.Data.SQLite这三个DLL. config配置数据库连接例如: <add name="SqliteConnectionString" connectionString="Data Source=C:\sqldb.db&q