支持常用的 类对象、匿名对象、数组、字典、字典集合、JSON、DataTable、树
List<Student> list = db.Queryable<Student>().ToList();
Student item = db.Queryable<Student>().First(it=>it.Id==1);
DataTable dataTable = db.Queryable<Student>().Select(it => it.Id).ToDataTable();
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();
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();;
当我们使用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; } }
2016 © donet5.comApache Licence 2.0