简单查询

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到底支持哪些函数,可以快速上手

不足点

打破用户的一些习惯



果糖网