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]
    
  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/hubro/p/6038503.html
Copyright © 2011-2022 走看看