DbSession.Default.From
.Where(Products._.CategoryID
.SubQueryNotIn(DbSession.Default.From
\).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
.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
.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
.InnerJoin
.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
.UnionAll(DbSession.Default.From
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
.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