查询返回值

SqlSugar ORM提供丰富的查询返回值, 灵活运用


Demo的Student类定义如下:

class Student
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int ID { get; set; }

    public string Name { get; set; }
    
    public DateTime CreateTime { get; set; }
}


注意: Demo使用的是最新的C# 7.2 语法, VS不支持的, 自行修改


说明: Demo大部分都使用了ToList方法, 其实不一定要用ToList方法, 使用ToDataTable, ToPageList, ToJson等等方法都可以, 返回值不同罢了


一: 返回List

var getAll = db.Queryable<Student>().ToList();
/*
生成SQL: SELECT [ID],[Name],[CreateTime] FROM [Student] 
其它数据库类似, 不一一列举
*/


二: 返回指定列匿名类集合

var data = db.Queryable<Student>()
    .Select(f => new
    {
      f.ID,
      f.Name
    }).ToList();
/*
生成SQL:
SELECT  [ID] AS [ID] , [Name] AS [Name]  FROM [Student] 
其它数据库类似, 不一一列举
*/


三: 返回单个列集合

//返回值为List<string>
List<string> data = db.Queryable<Student>().Select(f => f.Name).ToList();
/*
生成SQL:
SELECT [Name] FROM [Student] 
其它数据库类似, 不一一列举
*/


四: 返回指定类集合

List<ResultModel> data = db.Queryable<Student>()
    .Select(f => new ResultModel
    {
      ID = f.ID,
      StudentName = f.Name
    }).ToList();
/*
生成SQL:
SELECT  [ID] AS [ID] , [Name] AS [StudentName]  FROM [Student] 
其它数据库类似, 不一一列举
*/


五: 返回指定类集合升级版(4.9.3)-推荐用法

db.Queryable<Student,School>((st,sc)=>st.SchoolId=sc.Id).Select<ViewModelStudent>().ToList()

//只需要定义一个Model,支持自动填充
public class ViewModelStudent{
    public  int Id{get;set;}
    public  string Name{get;set;}
    public  string SchoolName{get;set;}//取名为 类名+类中属性名
}

//生成的Sql 
SELECT 
        st.[Id],
        st.[Name],
        sc.[Name] AS SchoolName 
        
        FROM Student st,School sc WHERE st.[SchoolId]=sc.[Id]


六: 返回JSON字符串

string json = db.Queryable<Student>().ToJson();


七: 多表链接查询返回匿名类集合或指定类集合

var data = db.Queryable<Student, School>((st, sc) => new object[]{ JoinType.Left,st.SchoolId==sc.Id})
         .Select((st, sc) => new { Name = st.Name, SchoolId = sc.Id }).ToList();
 //或者
 List<ResultModel> s4 = db.Queryable<Student, School>((st, sc) => new object[]{ JoinType.Left,st.SchoolId==sc.Id})
         .Select((st, sc) => new ResultModel { Name = st.Name, SchoolId = sc.Id }).ToList();
 /*
 生成的SQL以后再补
 
 注意, 别名要一致, 如Queryable<Student, School>((st, sc), 那么Select((st, sc), 要保持st, sc一致, 否则报错
 */


八: 多表链接查询返回DataTable

DataTable dt = db.Queryable<Student, School>((st, sc) => new object[]{ JoinType.Left,st.SchoolId==sc.Id})
         .Select((st, sc) => new { Name = st.Name, SchoolId = sc.Id }).ToDataTable();


九: 返回DataTable

//注意, 如你使用的是.Net Core版本的SqlSugar, DataTable为SqlSugar自定义的DataTable,不是System.Data.DataTable
DataTable dt = db.Queryable<Student>().ToDataTable();
/*
生成SQL: SELECT [ID],[Name],[CreateTime] FROM [Student] 
其它数据库类似, 不一一列举
*/


十: 查询返回值中调用函数

var data = db.Queryable<Student>()
    .Select(f => new
    {
      f.ID,
      f.Name.Trim()    //去左右空格, 只支持某些的系统函数, 具体查看http://www.codeisbug.com/Doc/8/1126
    }).ToList();


十一: 查询返回字典

List<KeyValuePair<int,string>> data = db.Queryable<Student>().Select<KeyValuePair<int,string>>("ID,Name").ToList();
//data的Key为ID列的值, value为Name列的值


十二: 查询, 把表结构返回为字典

var list = db.Queryable<Student>().Select<ExpandoObject>("*").ToList();
foreach (var item in list)
{
    Dictionary<string, object> dic = item.ToDictionary(x => x.Key, x => x.Value);
    //dic的Key为列的名称, value为列的值
}


十三:多表链接查询, 只返回某一个表

List<School> school = db.Queryable<Student,School>((st,sc)=>st.SchoolId=sc.Id).Select((st,sc)=>sc).ToList();

//返回多个表
List<School> school = db.Queryable<Student,School>((st,sc)=>st.SchoolId=sc.Id).Select((st,sc)=>new {st,sc}).ToList();

十四: 使用字符串代替Lambda表达进行查询

List<Student> list = db.Queryable<Student>().Select("*").ToList(); //查询所有列, 并返回List<Student>

List<ResultModel> list = db.Queryable<Student>().Select<ResultModel>("ID, Name").ToList(); //查询ID和Name两个列, 并转成List<ResultModel>
/*
ResultModel里面的属性无需和Select方法里面的列名字符串一一对应, 只会映射对应的列和属性
如ResultModel里面只有一个ID属性, 则只会匹配ID, Name不会引发异常
同时, 如果ResultModel里面的属性多, 只会是默认值, 也不会引发异常
*/


 十五 Mapper功能 是Select的升级版

Mapper是在Select后进行处理所以任何C#方法都支持也更强大多,Select是用来生成SQL,Mappper是在查询结果后进行加工,不需要你去循环二次处理,两者还是有区别的

   var s12 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Select<ViewModelStudent3>()

   .Mapper((it, cache) =>
                {
                    

                    /*用C#处理你想要的结果*/
                    it.Name = it.Name == null ? "null" : it.Name;
     }).ToList();


收藏到朋友圈: