5.x文档地址
http://www.donet5.com/Home/Doc
Demo的Student类定义如下:
//实体定义 http://www.donet5.com/Doc/8/1141 public class Student { public int ID { get; set; } public string Name { get; set; } }
查询所有
var getAll = db.Queryable<Student>().ToList(); /* 生成SQL: SELECT [ID],[Name] FROM [Student] */
取前5条
var top5 = db.Queryable<Student>().Take(5).ToList(); /* 生成SQL: SQL Server: SELECT * FROM (SELECT [ID],[Name],ROW_NUMBER() OVER( ORDER BY GetDate() ) AS RowIndex FROM [Student] ) T WHERE RowIndex BETWEEN 1 AND 5 SQL虽长但是性能和TOP5方式是一样的ORM保证了写法统一改成ROW方式 MySQL: SELECT `ID`,`Name` FROM `Student` LIMIT 0,5 Oracle: SELECT * FROM (SELECT "ID","Name",ROW_NUMBER() OVER( ORDER BY sysdate ) AS RowIndex FROM "Student" ) T WHERE RowIndex BETWEEN 1 AND 5 Sqlite: SELECT `ID`,`Name` FROM `Student` LIMIT 0,5 */
无锁查询
var getAllNoLock = db.Queryable<Student>().With(SqlWith.NoLock).ToList();
根据主键查询
var getByPrimaryKey = db.Queryable<Student>().InSingle(2); /* 生成SQL: SELECT [ID],[Name] FROM [Student] WHERE [ID] = @param; @param 值为 2 */
查询单条没有数据返回NULL, Single超过1条会报错,First不会
var getSingleOrDefault = db.Queryable<Student>().Single(); var getFirstOrDefault = db.Queryable<Student>().First(); /* 生成SQL: 参考Take函数 如果使用Single方法返回单条, 实际返回超过1条, 会引发异常, 使用First返回单条不会引发异常, 只返回第一条, 忽略其它的结果. */
UNION ALL
db.UnionAll<Student>(db.Queryable<Student>(),db.Queryable<Student>()).ToList(); /* 生成SQL: SQL Server: SELECT * FROM (SELECT [ID],[Name] FROM [Student] UNION ALL SELECT [ID],[Name] FROM [Student] ) unionTable MySQL: SELECT * FROM (SELECT `ID`,`Name` FROM `Student` UNION ALL SELECT `ID`,`Name` FROM `Student` ) unionTable Oracle: SELECT * FROM (SELECT "ID","NAME" FROM "STUDENT" UNION ALL SELECT "ID","NAME" FROM "STUDENT" ) UNIONTABLE Sqlite: SELECT * FROM (SELECT `ID`,`Name` FROM `Student` UNION ALL SELECT `ID`,`Name` FROM `Student` ) unionTable */
IN查询
//Id In (1,2,3), 指定列In查询 var in1 = db.Queryable<Student>().In(it=>it.ID,new int[] { 1, 2, 3 }).ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] WHERE [ID] IN ('1','2','3') 其它数据库类似, 就不一一举例了 */ //主键 In (1,2,3) 不指定列, 默认根据主键In var in2 = db.Queryable<Student>().In(new int[] { 1, 2, 3 }).ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] WHERE [ID] IN ('1','2','3') 其它数据库类似, 就不一一举例了 */ //Id In (1,2) 指定列的另外一种写法 int[] array = new int[] { 1, 2 }; var in3 = db.Queryable<Student>().Where(it=>array.Contains(it.ID)).ToList(); /* 生成SQL和上面一样 */
NOT IN查询
var in3 = db.Queryable<Student>().Where(it=>!array.Contains(it.ID)).ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] WHERE NOT ([ID] IN ('1','2')) 其它数据库类似, 就不一一举例了 */
条件查询
var getByWhere = db.Queryable<Student>().Where(it => it.Id == 1 || it.Name == "a").ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] WHERE (( [ID] = @ID0 ) OR ( [Name] = @Name1 )) 其中@ID0值为1, @Name1值为a MySQL: SELECT `ID`,`Name` FROM `Student` WHERE (( `ID` = @ID0 ) OR ( `Name` = @Name1 )) 其中@ID0值为1, @Name1值为a Oracle: SELECT "ID","NAME" FROM "STUDENT" WHERE (( "ID" = :ID0 ) OR ( "NAME" = :Name1 )) 其中:ID0值为1, :Name1值为a Sqlite: SELECT `ID`,`Name` FROM `Student` WHERE (( `ID` = @ID0 ) OR ( `Name` = @Name1 )) 其中@ID0值为1, @Name1值为a */
使用函数 SqlFunc类
//查询Name列不为空的结果, SqlFunc提供的功能远不止这一个, 在查询函数里面有详解 var getByFuns = db.Queryable<Student>().Where(it => SqlFunc.IsNullOrEmpty(it.Name)).ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] WHERE ( [Name]='' OR [Name] IS NULL ) MySQL: SELECT `ID`,`Name` FROM `Student` WHERE ( `Name`='' OR `Name` IS NULL ) Oracle: SELECT "ID","NAME" FROM "STUDENT" WHERE ( "NAME"='' OR "NAME" IS NULL ) Sqlite: SELECT `ID`,`Name` FROM `Student` WHERE ( `Name`='' OR `Name` IS NULL ) */
可以使用 SUM MAX MIN AVG查询单个字段
var sum = db.Queryable<Student>().Sum(it => it.ID); /* 生成SQL: SQL Server: SELECT SUM([ID]) FROM [Student] 其它数据库类型, 不一一列举 */
Between 1 and 20
var between = db.Queryable<Student>().Where(it => SqlFunc.Between(it.ID, 1, 20)).ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] WHERE ([ID] BETWEEN @MethodConst0 AND @MethodConst1) 其中@MethodConst0值为1, @MethodConst1值为20 MySQL: SELECT `ID`,`Name` FROM `Student` WHERE (`ID` BETWEEN @MethodConst0 AND @MethodConst1) 其中@MethodConst0值为1, @MethodConst1值为20 Oracle: SELECT "ID","NAME" FROM "STUDENT" WHERE ("ID" BETWEEN :MethodConst0 AND :MethodConst1) 其中:MethodConst0值为1, :MethodConst1值为20 Sqlite: SELECT `ID`,`Name` FROM `Student` WHERE (`ID` BETWEEN @MethodConst0 AND @MethodConst1) 其中@MethodConst0值为1, @MethodConst1值为20 */
使用 AS 取新的表名
var getListByRename = db.Queryable<School>().AS("Student").ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] */
排序
var getAllOrder = db.Queryable<Student>().OrderBy(it => it.ID).ToList(); //默认为ASC排序 /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] ORDER BY [ID] ASC 其它数据库类似 */ var getAllOrder = db.Queryable<Student>().OrderBy(it => it.ID, OrderByType.Desc).ToList(); //收到设置为DESC排序 /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] ORDER BY [ID] DESC */
多个字段排序
var data = db.Queryable<Student>() .OrderBy(it => it.ID, OrderByType.Desc) .OrderBy(it => it.Name, OrderByType.Asc) .ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name] FROM [Student] ORDER BY [ID] DESC,[Name] ASC 其它数据库类似 */
是否存在这条记录
var isAny = db.Queryable<Student>().Where(it => it.Id == -1).Any(); var isAny2 = db.Queryable<Student>().Any(it => it.Id == -1);
获取同一天的记录
var getTodayList = db.Queryable<Student>().Where(it => SqlFunc.DateIsSame(it.CreateTime, DateTime.Now)).ToList(); /* 生成SQL: SQL Server: SELECT [ID],[Name],[CreateTime] FROM [Student] WHERE (DATEDIFF(day,[CreateTime],@MethodConst0)=0) 其中@MethodConst0值为当前时间 MySQL: SELECT `ID`,`Name`,`CreateTime` FROM `Student` WHERE (TIMESTAMPDIFF(day,`CreateTime`,@MethodConst0)=0) 其中@MethodConst0值为当前时间 */
注意:SqlSugar拉姆达解析的函数都在SqlFunc这个类中,就算是Convert也请使用SqlFunc中的转换方法,这样做有3个好处
1.提高性能
2.减少底层
3.让用户知道我这个ORM到底支持哪些函数,可以快速上手
不足点
打破用户的一些习惯
2016 © donet5.comApache Licence 2.0