一. 分组查询
在SQL中使用Group By 来对数据分组,在实际中分组中一般与聚合函数一并使用。在Git.Framework中提供了相应的分组方法
DataTable Group(T entity); DataTable Group(T entity, bool isOpenTrans); IEnumerable<System.Linq.IGrouping<TKey, T>> Group<TKey>(T entity, Func<T, TKey> keySelector);
对某张表进行分组查询需要使用Group方法, 在分组的时候必须指定分组的字段。在Entity类中有一个方法Group方法,这个方法就是用于指定分组的字段.
AdminEntity entity = new AdminEntity(); entity.Group(a => a.CreateUser); DataTable table = this.Admin.Group(entity);
上面这段代码是使用CreateUser字段对表进行分组,返回两个字段: 一个CreateUser,一个是分组的行数
AdminEntity entity = new AdminEntity(); entity.Group(a => new { a.CreateUser,a.LoginCount}); DataTable table = this.Admin.Group(entity);
上面这段代码是根据两个字段分组,DataTable中返回三个字段,由上可知.
IEnumerable<System.Linq.IGrouping<TKey, T>> Group<TKey>(T entity, Func<T, TKey> keySelector);
这是一个高大上的方法,上面返回DataTable实属无奈,技艺当时还不精,所以只能硬生生的这么返回值。这个泛型的方法有点意思,也有点高级了,做Linq 的都知道。没错这个和Linq to SQL中的效果是一样的。返回一个Key--集合的模式.(对于动态类型目前还是升级中)
var query= this.Admin.Group(entity, a => new {a.UserCode }); foreach (var item in query) { string key=item.Key.UserCode; int count = item.Count(); }
二. 连接方法
在SQL Server中使用Left join, Right join 等关键字用于来连接查询,这个对于一个码农来说已经简单的不能再简单了的事情. 下面先看看一个做链接查询的规则问题
SELECT t0.[ID],t0.[UserName],t0.[PassWord],t0.[UserCode],t0.[RealName],t0.[Email],t0.[Mobile],t0.[Phone],t0.[CreateTime],t0.[CreateIp],t0.[CreateUser],t0.[LoginCount],t0.[Picture],t0.[UpdateTime],t0.[IsDelete],t0.[Status],t0.[DepartNum],t0.[ParentCode],t0.[RoleNum],t0.[Remark],t1.[RoleName] AS RoleName FROM [dbo].[Admin] AS t0 LEFT JOIN [dbo].[SysRole] AS t1 ON t0.[RoleNum]=t1.[RoleNum]
使用关键字LEFT JOIN [Table] ON 条件
在Entity中提供了几个用于连接查询的方法.
public void Inner<T>(T entity, params Git.Framework.DataTypes.Params<string, string>[] param) where T : BaseEntity; public void Left<T>(T entity, params Git.Framework.DataTypes.Params<string, string>[] param) where T : BaseEntity; public void Right<T>(T entity, params Git.Framework.DataTypes.Params<string, string>[] param) where T : BaseEntity;
看到上面几个方法可能有点发晕,先来解释一下具体是怎么回事。
T 是一个实体映射对象,就是数据库中映射的实体类, T entity 相当于Left Join中的右表
params Git.Framework.DataTypes.Params<string, string>[] param 这个又有点奇怪了,这个是用于指定左右表的连接字段,不明白先看看下面这个类
[Serializable] public class Params<T1> { public T1 Item1 { get; set; } public Params() { } } [Serializable] public class Params<T1, T2> { public T1 Item1 { get; set; } public T2 Item2 { get; set; } public Params() { } } [Serializable] public class Params<T1, T2, T3> { public T1 Item1 { get; set; } public T2 Item2 { get; set; } public T3 Item3 { get; set; } public Params() { } } [Serializable] public class Params<T1, T2, T3, T4> { public T1 Item1 { get; set; } public T2 Item2 { get; set; } public T3 Item3 { get; set; } public T4 Item4 { get; set; } public Params() { } } [Serializable] public class Params<T1, T2, T3, T4, T5> { public T1 Item1 { get; set; } public T2 Item2 { get; set; } public T3 Item3 { get; set; } public T4 Item4 { get; set; } public T5 Item5 { get; set; } public Params() { } } [Serializable] public class Params<T1, T2, T3, T4, T5,T6> { public T1 Item1 { get; set; } public T2 Item2 { get; set; } public T3 Item3 { get; set; } public T4 Item4 { get; set; } public T5 Item5 { get; set; } public T6 Item6 { get; set; } public Params() { } } [Serializable] public class Params<T1, T2, T3, T4, T5, T6,T7> { public T1 Item1 { get; set; } public T2 Item2 { get; set; } public T3 Item3 { get; set; } public T4 Item4 { get; set; } public T5 Item5 { get; set; } public T6 Item6 { get; set; } public T7 Item7 { get; set; } public Params() { } } [Serializable] public class Params<T1, T2, T3, T4, T5, T6,T7,T8> { public T1 Item1 { get; set; } public T2 Item2 { get; set; } public T3 Item3 { get; set; } public T4 Item4 { get; set; } public T5 Item5 { get; set; } public T6 Item6 { get; set; } public T7 Item7 { get; set; } public T8 Item8 { get; set; } public Params() { } }