DMSLinq表达式框架实现(总)
1.写这个框架要感谢一下之前的公司,逼我深入学习LINQ的一些东西.前前后修改过两三次,该框架不和IQueryable查询相似,但不是基于IQueryable来写的,所以非常方便扩展,最终实现多表查询和支持部分linq from语法(懒加载技术,不支持into语法).
如:
var q1 = from x in DMS.Create<SysRole>(false, false) where x.SysRoleID > 0 && x.RoleName.Like("s") select x; var q2 = from x in DMS.Create<SysRole>(false, false) join y in DMS.Create<SysRolePower>() on x.SysRoleID equals y.SysRoleID select new { x.SysRoleID, y.SysRolePowerID, x.RoleName };
2.支持子查询的语法(必须在子查询中对表名进行As)
var query = DMS.Create<SysRolePower>().Where(q => q.SysRolePowerID > 0 && q.Remark.Like("qq")).Select(q => new { q.SysRolePowerID, RoleName = DMS.Create<SysRole>().As("x").Where(x => x.SysRoleID == q.SysRoleID && x.RoleName.Like("s")) .ToColumn<string>(), });
3.数据返回默认为DataTable类型,一般可以ToList<任意类型>(),根据类型的属性字段进行值,不像IQueryable里面的ToList不能传类型,需进行Select进行赋值.大大减少代码量
4.支持数据过滤接口,可在框架外进行实现IDMSLinqQueryFilter接口进行配置过滤表的纵向数据权限,横向数据权限可用ColumnsClip进行拼接的方式进行调整.
<configuration> <configSections> <section name="DMSLinqQueryProvider" type="KingNET.DMSFrame.DMSLinq.DMSLinqQueryProvider,KingNET.DMSFrame.DMSLinq"/> </configSections> <DMSLinqQueryProvider> <add key="query1" value="KingNET.DMSFrame.Business.QueryFilterBLL,KingNET.DMSFrame.Business"/> </DMSLinqQueryProvider> </configuration>
5.支持字段拼接查询或做为条件
var query2 = DMS.Create<UserInfo>().Select(q => q.Columns((q.Title + q.UserName).As("UserName")));
千人.NET交流群:18362376,因为有你,代码变得更简单,加群请输入cnblogs