Hxj.Data 数据库组件文档 下载本文

DbSession.Default.From()

.Where(Products._.CategoryID

.SubQueryNotIn(DbSession.Default.From().Where(Categories._.CategoryName ==

\).Select(Categories._.CategoryID))) .ToList(); 生成的sql如下

Text:

SELECT * FROM [Products] WHERE [Products].[CategoryID]

NOT IN ( SELECT [Categories].[CategoryID] FROM [Categories] WHERE [Categories].[CategoryName] = @32365a219b864e5fbeb7959a6071d4c8)

Parameters:

@32365a219b864e5fbeb7959a6071d4c8[String] = Produce

子查询是不是也变的很简单的呢了。 下一节将讲述联合查询。

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

联合查询在前面的例子中已经出现过,只不过没有细说。 先来个例子吧

DbSession.Default.From()

.InnerJoin(Customers._.CustomerID == Orders._.CustomerID)

.ToDataTable(); 生成的sql

Text:

SELECT * FROM [Customers] INNER JOIN [Orders] ON ([Customers].[CustomerID] = [Orders].[CustomerID])

是非常简单操作就完成了。 方法 InnerJoin LeftJoin

联合查询(sql) inner join left join 29

RightJoin CrossJoin FullJoin Union UnionAll 还是上例子清爽一些

right join cross join full join union union all DbSession.Default.From()

.LeftJoin(Customers._.CustomerID == Orders._.CustomerID)

.Where(Customers._.Country == \) .ToDataTable(); 生成的sql

Text:

SELECT * FROM [Customers] LEFT OUTER JOIN [Orders]

ON ([Customers].[CustomerID] = [Orders].[CustomerID])

WHERE [Customers].[Country] = @e3c66f9aa65c498abfd76908621b567a

Parameters:

@e3c66f9aa65c498abfd76908621b567a[String] = USA

InnerJoin、LeftJoin、RightJoin、CrossJoin、FullJoin这个操作都是类似的。 三个表及以上关联例如

DbSession.Default.From()

.InnerJoin(Customers._.CustomerID == Orders._.CustomerID)

.InnerJoin(Order_Details._.OrderID == Orders._.OrderID)

.Where(Customers._.Country == \) .ToDataTable(); 生成的sql:

Text:

SELECT * FROM [Customers]

INNER JOIN [Orders] ON ([Customers].[CustomerID] = [Orders].[CustomerID]) INNER JOIN [Order Details] ON ([Order Details].[OrderID] = [Orders].[OrderID]) WHERE [Customers].[Country] = @5901349776db425492724e16c3c03a7a

30

Parameters:

@5901349776db425492724e16c3c03a7a[String] = USA

关联查询一下变简单了吧。 下面讲union 和 union all

这两个是两个结果的合集,union会区分结果排除相同的,union all 则直接合并结果集合。

DbSession.Default.From().Where(Customers._.Country == \)

.UnionAll(DbSession.Default.From().Where(Customers._.Country == \)) .ToList(); 生成的sql如下

Text:

SELECT * FROM

(( SELECT * FROM [Customers] WHERE [Customers].[Country] = @f5b865bb20b64387b2c1be466c6d0980) UNION ALL

( SELECT * FROM [Customers] WHERE [Customers].[Country] = @b7de905de065418dab5820094c764e1b)) AS Customers

Parameters:

@f5b865bb20b64387b2c1be466c6d0980[String] = USA @b7de905de065418dab5820094c764e1b[String] = UK

写到这里的时候发现了一个bug,所以请大家重新下载新版本。 union 和 union all用法是一样的,就不再举例子了。 下一节将讲述排序和分组。

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

本节将讲述查询的排序(order by) 和 分组(group by)。 先说排序

在分页中如果没有指定排序,组件会默认一个排序来实现分页。 例如

DbSession.Default.From()

31

.Page(10, 2)

.Where(Products._.CategoryID.SelectIn(1, 2, 3)) .ToList(); 生成的sql如下:

Text:

SELECT * FROM

( SELECT TOP 10 * FROM

( SELECT TOP 20 * FROM [Products] WHERE [Products].[CategoryID] IN

(@c651c8c47b4f4b7587a65b1efeea17a2,@210f5286b2ec4ceabae99f4729d22a74,@5abe298074eb43e98016af330da896e1) ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC

Parameters:

@c651c8c47b4f4b7587a65b1efeea17a2[Int32] = 1 @210f5286b2ec4ceabae99f4729d22a74[Int32] = 2 @5abe298074eb43e98016af330da896e1[Int32] = 3

这里就默认指定了productid作为排序。 当然我们也可自己指定排序,

DbSession.Default.From() .Page(10, 2)

.Where(Products._.CategoryID.SelectIn(1, 2, 3)) .OrderBy(Products._.CategoryID.Asc) .ToList(); 生成的sql如下:

Text:

SELECT * FROM

( SELECT TOP 10 * FROM

( SELECT TOP 20 * FROM [Products] WHERE [Products].[CategoryID] IN

(@2ba49ec0bf2e47558a06a5ec8a80476a,@1963fb47beb9421896891620c89abddb,@80d632cbcd5843958606bf85371a0428)

ORDER BY [Products].[CategoryID] ASC) AS tempIntable ORDER BY [CategoryID] DESC) AS tempOuttable ORDER BY [CategoryID] ASC

Parameters:

@2ba49ec0bf2e47558a06a5ec8a80476a[Int32] = 1 @1963fb47beb9421896891620c89abddb[Int32] = 2 @80d632cbcd5843958606bf85371a0428[Int32] = 3

分页的时候就按照categoryid来正序排列。

32