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添加条件来实现基于条件的汇总统计

posted @ 2012-08-12 23:46  beetlex  阅读(1782)  评论(0编辑  收藏  举报