分组查询

分组查询和使用

只有在聚合对象需要筛选的时候才会用到Having,一般分组查询用不到可以去掉

var list = db.Queryable<Student>()
             .GroupBy(it => new { it.Id, it.Name })
             .Having(it => SqlFunc.AggregateAvg(it.Id) > 0)//不是聚合函数用Where就可以了
             .Select(it => new { idAvg = SqlFunc.AggregateAvg(it.Id), name = it.Name })
             .ToList();
//SELECT AVG([Id]) AS[idAvg], [Name] AS[name]  FROM[Student] GROUP BY[Name],[Id] HAVING(AVG([Id]) > 0 )

根据时间分组,不计时分秒,只按日期分组

var getOrderBy = db.Queryable<Order>().Select(it=>new  {
                 Id=it.Id,
                 Name=it.Name,
                 CreateTime=it.CreateTime.Date//只取日期
             })
            .MergeTable()//将查询结果转成一个表
            .GroupBy(it=>it.CreateTime)
            .Select(it=>new { id =SqlFunc.AggregateMax(it.Id),crate=it.CreateTime })
            .ToList();


Distinct使用

一般用来指定字段去重复

var list = db.Queryable<Student>().Distinct().Select(it => new { it.Name }).ToList();
SELECT  DISTINCT  [Name] AS [Name]  FROM [STudent]


分组获取第一条

像Oracle SqlServer可以用 PartitionBy实现

db.Queryable<Order>().PartitionBy(it=>it.Name).Take(1).ToList()

 其它数据库 PartitionBy 等同于 Group by