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")));

 

 

 

 

posted @ 2012-06-10 00:00  kingkoo  阅读(1043)  评论(0编辑  收藏  举报