zoukankan      html  css  js  c++  java
  • Smark.Data 灵活的查询描述

            使用Smark.Data进行数据查询时必须通过对象来描述,其主要描述信息包括查询来源于那些表和需要那些信息等,即使平常的最常面对的关联查询,数据汇总查询等都可以通过实体描述来完成.因此实体描述在组件中起到一个非常重要的作用,可以说所有数据处理都必须经过实体描述.以下是简单地介绍Smark.Data的实体描述能完成那些数据查询工作.

        [Table]
        interface ICustomers
        {
            [ID]
            [IDENTITY]
            string CustomerID { get; set; }
            [Column]
            string CompanyName { get; set; }
            [Column]
            string ContactName { get; set; }
            [Column]
            string ContactTitle { get; set; }
            [Column]
            string Address { get; set; }
            [Column]
            string City { get; set; }
            [Column]
            string Country { get; set; }
            [Column]
            string Phone { get; set; }
            [Column]
            string Region { get; set; }
        }
    以上是描述一个简单的客户信息,不过想要这个接口生自动生成对应的实体类需要安装一个插件,详细查看Smark.Data.I2MGenerator,最终生成的实体类是接口缺少I的名称。定义后就可以针对这个实体查询
        Expression exp = new Expression();
        if (!string.IsNullOrEmpty(FirstName))
            exp &= Modules.Employee.firstName.Like(FirstName + "%");
        if (!string.IsNullOrEmpty(LastName))
            exp &= Modules.Employee.lastName.Like(LastName + "%");
        if (!string.IsNullOrEmpty(City))
            exp &= Modules.Employee.city == City;
        if (!string.IsNullOrEmpty(Region))
            exp &= Modules.Employee.region == Region;
        Records = exp.List<Modules.Employee>(); 
        

    自定义对象查询

    之前的查询是把表中所有信息填充到Employee对象中,在实际应用很多逻辑处理只是需要获某些信息,如果都获取所有信息显然是不可取的做法.组件虽然不提供填充到匿名对象,但可以针对自定义对象填充.如果只想获取Employee的id,firstname,lastname等字段只需要定义以下对象即可

        public class EmpNames
        {
           public string EmployeeID { get; set; }
           public string FirstName { get; set; }
           public  string LastName { get; set; }
        }

    使用的时候调用相关重载版本方法

        Expression exp = new Expression();
        foreach (EmpNames item in exp.List<Employee, EmpNames>())
        {
            Console.WriteLine(item.FirstName);
        }

    以上查询虽然是针对Employee对象,但最终生成的SQL只会包括EmpNames描述的字段信息,其他字段并不会生成到select中.

    关联查询

    在实际应用中关联查询是比较普通的需求,如果只对针对单表查询的话,如果组件不支持那在项目用中使用就失去了他的意义.组件虽然不具备LINQ TO SQL那种关联查询语法,但通过另外的方式来达到相同的目的,组件的实全描述完全具备描述一个关联查询的能力.以下是订单明细信息和产品关联获取相关信息的简单描述:

        [Table(" OrderDetails inner join products on OrderDetails.productid= products.productid")]
        public interface IOrderDetailView
        {
            [Column]
            string ProductName { get; set; }
            [Column("OrderDetails.UnitPrice")]
            decimal UnitPrice { get; set; }
            [Column]
            decimal Quantity { get; set; }
            [Column]
            decimal Discount { get; set; }
        }

    可以通过以下查询得到某订单的明细信息:

        Record = (Modules.Order.orderID == OrderID).ListFirst<Modules.OrderView>();

    描述关联查询其实很简单,只需要在Table描述里定义关联表的信息描述即可,然后实体成员定义需要加载的字段信息,如果存在不明确的情况定义信息具体来源即可.

    汇总统计描述

    既然实体可以描述关联查询,那汇总统计查询也可以通过实体来描述这样一个查询需求,以下是统计各城市客户订单数量描述

        [Table("customers inner join orders on customers.customerid=orders.customerid")]
        public interface ICustOrderGroupByCity
        {
            [Column]
            string Country { get; set; }
            [Column]
            string City { get; set; }
            [Count]
            int Count { get; set; }
        }

    只需要使用Expression的List方法就能汇总表中的相关信息

                Expression exp = new Expression();
                var empviews = exp.List<CustOrderGroupByCity>();

    实际应用可以通过Expression添加条件来实现基于条件的汇总统计

    访问Beetlex的Github
  • 相关阅读:
    解决html中&nbsp;在不同浏览器中占位大小不统一的问题 SUperman
    解决C#调用执行js报检索 COM 类工厂中 CLSID 为 {0E59F1D51FBE11D08FF200A0D10038BC} 组件失败
    面向对象程序设计_tesk1_寒假伊始
    面对对象程序设计_task2_1001.A+B Format (20)
    面向对象程序设计_Task5_Calculator1.5.0
    面向对象程序设计_Task4_Calculator1.1
    面向对象程序设计_课堂作业_01_Circle
    面向对象程序设计__Task3_Calculator
    面对对象程序设计_task2_C++视频教程
    pkgconfig 简述
  • 原文地址:https://www.cnblogs.com/smark/p/2635613.html
Copyright © 2011-2022 走看看