zoukankan      html  css  js  c++  java
  • CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录

    1. CRL快速开发框架系列教程一(Code First数据表不需再关心)
    2. CRL快速开发框架系列教程二(基于Lambda表达式查询)
    3. CRL快速开发框架系列教程三(更新数据)
    4. CRL快速开发框架系列教程四(删除数据)
    5. CRL快速开发框架系列教程五(使用缓存)
    6. CRL快速开发框架系列教程六(分布式缓存解决方案)
    7. CRL快速开发框架系列教程七(使用事务)
    8. CRL快速开发框架系列教程八(使用CRL.Package)
    9. CRL快速开发框架系列教程九(导入/导出数据)
    10. CRL快速开发框架系列教程十(导出对象结构)
    11. CRL快速开发框架系列教程十一(大数据分库分表解决方案)
    12. CRL快速开发框架系列教程十二(MongoDB支持)
    13. CRL快速开发框架系列教程十三(嵌套查询)

     正文

    CRL采用Lambda表达式表示查询逻辑,表达式和拼串式的语法比较,优点如下

    • 原生语法&运算符支持
      基于Linq.Expressions语法方便好用
    • 强类型检查编译
      不用担心名字写错了,类型写错了,编译时IDE就会提示了
    • 传参方便
      例:b=>b.Id==1 参数直接写,统一处理后,也不用担心注入问题
    • 与SQL函数基本等效的扩展方法
      例:b=>b.Name.Substring(0,2)="22" 表示SQL SUBSTRING(name,0,2)

    CRL对象管理基类是个抽象类,里面封装好了常用的方法,这意味着,不用再傻傻的去写什么FindOne,FindAll方法了

    ORM只是CRL中的一部份功能,对象管理类是进一步封装,所以才有CRL.BaseProvider<T>

    实现对象管理

    public class ProductDataManage : CRL.BaseProvider<ProductData>
    public static ProductDataManage Instance
            {
                get { return new ProductDataManage(); }
            }
    var instance = ProductDataManage.Instance;
    

    直接用表达式查询

    var item = instance.QueryItem(b => b.Id > 1);
    var list = instance.QueryList(b => b.Id > 1);
    

    创建完整查询语法

    var query = instance.GetLambdaQuery();//创建查询
    query.Top(100);//取多少条
    query.Where(b => b.Id < 700);//查询条件
    query.OrderBy(b => b.Id, true);//排序条件
    var list = query.ToList();
    

    如果要进行分页,则只需

    query.Page(10, 1);//页大小,页索引
    

    以上是返回当前对象,若要返回指定某些属性,可返回Dynamic类型

    如GROUP查询

    //using CRL以获取扩展方法
                var query = instance.GetLambdaQuery();
                query.Where(b => b.Id > 0);
                query.Top(10);
                //选择GROUP字段
                query.Select(b => new
                {
                    b.BarCode,
                    sum2 = b.SUM(x => x.Number * x.Id),//等效为 sum(Number*Id) as sum2
                    total = b.BarCode.COUNT(),//等效为count(BarCode) as total
                    sum1 = b.Number.SUM(),//等效为sum(Number) as sum1
                    b.ProductName
                });
                //GROUP条件
                query.GroupBy(b => new { b.BarCode, b.ProductName });
                //having
                query.GroupHaving(b => b.Number.SUM() >= 0);
                //设置排序
                query.OrderBy(b => b.BarCode.Count(), true);//等效为 order by count(BarCode) desc
    var list = query.ToDynamic();
    

    进行简单关联查询

    一般只返回选择的部份字段,调用Select方法,返回动态类型

    //返回筛选值
                var query = instance.GetLambdaQuery();
                query.Top(10);
                var member = new Code.Member();
                member.Id = 11;
                query.Join<Code.Member>((a, b) => a.UserId == member.Id && b.Id > 0,
                     CRL.LambdaQuery.JoinType.Left
                    ).Select((a, b) => new { BarCode1 = a.BarCode, Name1 = b.Name,a.ProductName });
                var list = query.ToDynamic();
    

    如果要返回主表所有字段,和关联表部份字段呢,调用SelectAppendValue方法

    此时返回主对象和内置索引值

    //把关联值存入对象内部索引
                //关联对象值都以索引方式存取
                var query = instance.GetLambdaQuery();
                query.Top(10);
                query.Join<Code.Member>((a, b) => a.UserId == b.Id && b.Id > 0,
                    CRL.LambdaQuery.JoinType.Left
                    ).SelectAppendValue(b => new { Name1 = b.Name });
                var list = query.ToList();
    foreach (var item in list)
                {
                    var str = string.Format("{0}______{1}<br>", item.BarCode, item.Bag.Name1);//取名称为Name1的索引值
                    Response.Write(str);
                }
    

    如果有多次关联,再调用Join方法即可

    通过这两种返回值方式,相信可以适应大部份场景了

    扩展方法

    为了实现SQL函数调用,用扩展方法代替表示

    以下是CRL支持的扩展方法

    //using CRL 以获取扩展方法
                //对于一元运算,可按!=判断,如b.ProductName.Contains("122") 和!b.ProductName.Contains("122")
                var query = instance.GetLambdaQuery();
                query.Where(b => b.Id < b.Number);//直接比较可以解析通过
                query.Where(b => b.ProductName.Contains("122"));//包含字符串
                query.Where(b => !b.ProductName.Contains("122"));//不包含字符串
                query.Where(b => b.ProductName.In("111", "222"));//string in
                query.Where(b => b.AddTime.Between(DateTime.Now, DateTime.Now));//在时间段内
                query.Where(b => b.AddTime.DateDiff(DatePart.dd, DateTime.Now) > 1);//时间比较
                query.Where(b => b.ProductName.Substring(0, 3) == "222");//截取字符串
                query.Where(b => b.Id.In(1, 2, 3));//in
                query.Where(b => !b.Id.In(1, 2, 3));//not in
                query.Where(b => b.UserId.Equals(Code.ProductChannel.其它));//按值等于,enum等于int
                query.Where(b => b.ProductName.StartsWith("abc"));//开头值判断
                query.Where(b => b.Id.Between(1, 10));//数字区间
                query.Where(b => b.ProductName.Like("123"));// %like%
                query.Where(b => b.ProductName.LikeLeft("123"));// %like
                query.Where(b => b.ProductName.LikeRight("123"));// like%
                query.Where(b => !string.IsNullOrEmpty(b.BarCode));
                int LastDays = 30;
                query.Where(b => b.AddTime.DateDiff(CRL.DatePart.dd, DateTime.Now) < LastDays);
    

    一些转换函数也支持

    query.Where(b => b.Id.ToString() == "123");//支持Cast转换
    query.Where(b => Convert.ToString(b.Id) == "1");
    

    等等...

    关于结果返回

    • 使用LambdaQuery完整查询调用Page方法就可以分页了,通过ToList和ToDynamic方法返回指定类型结果
    • 当设置了关联,Group语法,也会按关联,Group语法解析
    • 当调用了Select方法筛选字段,则需要根据实际情况返回结果类型
    • 返回结果可以有以下几种类型
      • List<dynamic> ToDynamic() 按筛选值返回动态类型
      • List<TResult> ToList<TResult>() 按筛选值返回指定类型
      • List<T> ToList() 直接返回当前类型
      • Dictionary<TKey, TValue> ToDictionary<TKey, TValue>() 按筛选值返回字典(不支持分页)

    打印查询

    当是完整查询,调用query.PrintQuery()返回生成的查询语句和参数

    如上关联查询打印出来为

    [SQL]:select top 10 t1.[BarCode] as BarCode1,t2.[Name] as Name1,t1.[ProductName1] as ProductName  from [ProductData] t1  with(nolock)  Left join [Member] t2   with(nolock) on ((t1.[UserId]=@par0) AND (t2.[Id]>@par1))  
    [par0]:[11]
    [par1]:[0]
    
  • 相关阅读:
    分享上大学时CCTV5经常播放的一段宣传片
    嗯, 在Vista下面post一篇, 快过年的二三事
    [转自天涯]很多年以前,我是一个中锋
    关于Anthem的Button控件, 为啥仍然会PostBack?
    小白三下杭州
    搜狗, 谷歌, 紫光, 3大输入法互打结果.
    2008春节回家流水账
    早上拍的雪景.
    如果安装.net framework 3.5出错, 可以这样解决
    我那幸福的坐车偶记...
  • 原文地址:https://www.cnblogs.com/hubro/p/6038503.html
Copyright © 2011-2022 走看看