查询结果

支持常用的 类对象、匿名对象、数组、字典、字典集合、JSON、DataTable、树

返回List

List<Student> list = db.Queryable<Student>().ToList();


返回第一个实体

Student item = db.Queryable<Student>().First(it=>it.Id==1);


返回DataTable

DataTable dataTable = db.Queryable<Student>().Select(it => it.Id).ToDataTable();


返回Json

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


返回数组

List<int> listInt=db.Queryable<Student>().Select(it => it.Id).ToList();


返回匿名对象

var dynamic = db.Queryable<Student>().Select<dynamic>().ToList();


返回到新类 

var viewModel = db.Queryable<Student, School, DataTestInfo>((st, sc, di) => new JoinQueryInfos(
        JoinType.Left, st.SchoolId == sc.Id,
        JoinType.Left, st.Name == di.String
    ))
    .Select<ViewModelStudent>().ToList();


多表返回匿名对象

var newDynamic = db.Queryable<Student, School, DataTestInfo>((st, sc, di) => new JoinQueryInfos(
    JoinType.Left, st.SchoolId == sc.Id,
    JoinType.Left, st.Name == di.String
)) .Select((st,sc,di)=>new { name=st.Name,scid=sc.Id }).ToList();


手动返回到新类

var newClass= db.Queryable<Student, School, DataTestInfo>((st, sc, di) => new JoinQueryInfos(
    JoinType.Left, st.SchoolId == sc.Id,
    JoinType.Left, st.Name == di.String
)) .Select((st,sc,di)=>new ClassName{ name=st.Name,scid=sc.Id }).ToList();


多表查一表

var oneClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
    JoinType.Left, o.Id == i.OrderId,
    JoinType.Left, o.CustomId == c.Id
))
.Select((o, i, c) => c).ToList();


多表返回2表

var twoClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
JoinType.Left, o.Id == i.OrderId,
JoinType.Left, o.CustomId == c.Id
))
.Select((o, i, c) => new { o,i}).ToList()


返回字典

 //表达式返回字典
 Dictionary<string,object> dc = db.Queryable<Order>().ToDictionary(it=>it.Id,it=>it.Name);

 //动态Sql返回字典
 Dictionary<string,object> dc = db.Queryable<Order>()
                              .Select<KeyValuePair<string,object>>("id as id1,name as name1")
                              .ToList().ToDictionary(it=>it.Key,it=>it.Value);


返回字典集合

List<Dictionary<string, object>> dcList = db.Queryable<Order>().ToDictionaryList();;


ORM解析特殊函数

当我们使用Select时候有一个字段用到了特殊的C#函数解析不了,我们可以用Mapper单独对这个字段进行处理,

原理:是Select是用来生成Sql,Mapper是对ToList后的结果进行的转换,所以支持任何C#函数

var newClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
                   JoinType.Left, o.Id == i.OrderId,
                   JoinType.Left, o.CustomId == c.Id
               ))
                .Select((o, i, c) => new ViewOrder {
                    Name =o.Name,  
                    CustomName=c.Name,
                    Id=it.Id//暂时不处理
                })
                .Mapper(it=> {

                    it.Id =  Util.GetNo(it.Id)  ; //这里处理

Mapper处理匿名对象需要这么写,需要加上(daynamic)

db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
    JoinType.Left, o.Id == i.OrderId,
    JoinType.Left, o.CustomId == c.Id
))
.Select((o, i, c) =>
(dynamic) new { orderName = o.Name, cusName=c.Name }).Mapper(it=> { it.orderName = "_"+it.orderName; }).ToList();

更多Mapper用法: http://www.donet5.com/Home/Doc?typeId=1188


双查询结果用法

当我们需要在select后在外面在包一层select,代码如下

      var getAll = db.Queryable<Order>()
            .Select(it => new Order
            {
                Id = it.Id * 2,
                Name = it.Name
            })
            .MergeTable()//将上面的操作变成一个表 mergetable
            .GroupBy(it => it.Id)//对表mergetable进行分组
            .Select(it =>new{ id=it.Id }).ToList();//查询mergetable表里面的字段
SELECT `Id` FROM  
        (SELECT  ( `Id` * @Id0 ) AS `Id` , `Name` AS `Name`  FROM `Order`  ) MergeTable 
 GROUP BY `Id`
参数 @Id0:2


树型查询

当然实体不一定叫tree,Child也不一定叫Child, ParentId也不一定叫Parentid,结构上一样就行

var tree = db.Queryable<Tree>().ToTree(it=>it.Child,it=>it.ParentId,0); //第三个参数为0代表 parent为0是第一级
//实体
public class Tree
{
        [SqlSugar.SugarColumn(IsPrimaryKey =true)]
        public int Id { get; set; }
        public string Name { get; set; }
        public int ParentId { get; set; }
        [SqlSugar.SugarColumn(IsIgnore = true)]
        public List<Tree> Child { get; set; }
}