原本不支持 IQueryable 主要出于使用习惯的考虑,如果继承 IQueryable,编写代码的智能总会提示出现一堆你不想使用的方法(对不起,我有强迫症),IQueryable 自身提供了一堆没法实现的方法,还有外部入侵的扩展方法,严重影响编码体验。如下图:
原以为必须实现 IQueryable 才可以实现,结果一次惊喜,原来只要有对应的方法就成。
虽然支持了,但是还是推荐使用【链式 + lambda】 !!!
特别说明
这次功能更新,ISelect 增加了 5个方法,对【链式 + lambda】的用户可能会造成少许影响,我在注释上标明了,如下图:
特别是 .Select(),原先没有支持,该功能与 ToList(a => new Dto{}) 合并实现的。
需要避免一下坑:
如果一定要使用 .Select() 方法,请务必在 .ToList() 之前调用它;
请减少图中方法在【链式 + labmda】模式下的使用;
所有 ISelect 都可以使用 linq to sql,包括 Repository、DbContext;
Where
var t1 = (from a in fsql.Select<Student>()where a.id == item.idselect a
).ToList();
Select(指定字段)
var t1 = (from a in fsql.Select<Student>()where a.id == item.idselect new { a.id }
).ToList();
CaseWhen
var t1 = (from a in fsql.Select<Student>()where a.id == item.idselect new {a.id,a.name,testsub = new {time = a.age > 10 ? "大于" : "小于或等于"}}
).ToList();
Join
var t1 = (from a in fsql.Select<Student>()join b in fsql.Select<School>() on a.id equals b.StudentIdselect a
).ToList();var t2 = (from a in fsql.Select<Student>()join b in fsql.Select<School>() on a.id equals b.StudentIdselect new { a.id, bid = b.id }
).ToList();var t3 = (from a in fsql.Select<Student>()join b in fsql.Select<School>() on a.id equals b.StudentIdwhere a.id == item.idselect new { a.id, bid = b.id }
).ToList();
LeftJoin
var t1 = (from a in fsql.Select<Student>()join b in fsql.Select<School>() on a.id equals b.StudentId into tempfrom tc in temp.DefaultIfEmpty()select a
).ToList();var t2 = (from a in fsql.Select<Student>()join b in fsql.Select<School>() on a.id equals b.StudentId into tempfrom tc in temp.DefaultIfEmpty()select new { a.id, bid = tc.id }
).ToList();var t3 = (from a in fsql.Select<Student>()join b in fsql.Select<School>() on a.id equals b.StudentId into tempfrom tc in temp.DefaultIfEmpty()where a.id == item.idselect new { a.id, bid = tc.id }
).ToList();
From(多表查询)
var t1 = (from a in fsql.Select<Student>()from b in fsql.Select<School>()where a.id == b.StudentIdselect a
).ToList();var t2 = (from a in fsql.Select<Student>()from b in fsql.Select<School>()where a.id == b.StudentIdselect new { a.id, bid = b.id }
).ToList();var t3 = (from a in fsql.Select<Student>()from b in fsql.Select<School>()where a.id == b.StudentIdwhere a.id == item.idselect new { a.id, bid = b.id }
).ToList();
GroupBy(分组)
var t1 = (from a in fsql.Select<Student>()where a.id == item.idgroup a by new {a.id, a.name } into gselect new {g.Key.id, g.Key.name,cou = g.Count(),avg = g.Avg(g.Value.age),sum = g.Sum(g.Value.age),max = g.Max(g.Value.age),min = g.Min(g.Value.age)}
).ToList();
系列文章导航
(一)入门
(二)自动迁移实体
(三)实体特性
(四)实体特性 Fluent Api
(五)插入数据
(六)批量插入数据
(七)插入数据时忽略列
(八)插入数据时指定列
(九)删除数据
(十)更新数据
(十一)更新数据 Where
(十二)更新数据时指定列
(十三)更新数据时忽略列
(十四)批量更新数据
(十五)查询数据
(十六)分页查询
(十七)联表查询
(十八)导航属性
(十九)多表查询
(二十)多表查询 WhereCascade
(二十一)查询返回数据
(二十二)Dto 映射查询
(二十三)分组、聚合
(二十四)Linq To Sql 语法使用介绍
(二十五)延时加载
(二十六)贪婪加载 Include、IncludeMany、Dto、ToList
(二十七)将已写好的 SQL 语句,与实体类映射进行二次查询
(二十八)事务
(二十九)Lambda 表达式
(三十)读写分离
(三十一)分区分表
(三十二)Aop
(三十三)CodeFirst 类型映射
(三十四)CodeFirst 迁移说明
(三十五)CodeFirst 自定义特性