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

转载于:https://www.cnblogs.com/smark/archive/2012/08/12/2635613.html

Smark.Data 灵活的查询描述相关推荐

  1. Smark.Data实体默认值描述

    在数据设计的时候会针对一些字段设置默认的值,Smark.Data同样支持这样的功能,组件通过在属性中描述一个Value属性来告诉组件这个值如果在没有设置的情况应该提供怎样的值.组件提供一个描述的基类, ...

  2. Smark.Data 功能强大又灵活的Expression

    Expression对象是Smark.Data的核心对象,虽然Expression是个条件对象,但它所具备的功能是你想象不到的:),以下把Expression的功能列出来. public RESULT ...

  3. Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第一部分)

    2019独角兽企业重金招聘Python工程师标准>>> 开发人员在开发数据库应用时经常要用到数据表查询.在Xqk.Data的第一个示例中,我们就使用了SelectAll方法来获取数据 ...

  4. Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第三部分:SqlField)

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇<丰富的.灵活的查询方法(第二部分:适应不同数据库系统的查询)>中提到,为适应不同的数据库系统,Xqk.Da ...

  5. Smark.Data 值转换器

    组件支持属性转换描述,主要用于对象属性值和数据存储之前的转换,如常见的枚举和数值,枚举和字符,用户密码等信息转换存储.实际上也可以扩展更灵活的转换如对象关联字段转换,对象序列化转等等. 在Smark. ...

  6. 开源数据访问组件Smark.Data 1.8

    Smark.Data一直强调以最简单和高效的方式访问数据库,在这个版本中组件引入了Query<T>对象,它是一个查询值描述对象,通过它可以更方便地进行数据查询并获取结果.组件会分析T的具体 ...

  7. Smark.Data

    http://www.ikende.com/smarkdata.aspx Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操 ...

  8. Smark.Data 1.5更新详解

    由于一直忙于Beetle的开发和优化,Smark.Data组件已经有很长一段时间更新.这段时间发现Smark.Data在某些情况下不足,而这些情况又比较普遍所以进行了1.5版的更新.其更新的主要功能包 ...

  9. 开源数据访问组件Smark.Data 1.8入门编

    本章节主要讲述如何使用Smark.Data 1.8进行快速的数据库应用开发,主要内容包括配置,执行SQL和存储过程等基础的数据操作. 配置 在组件使用之前必须进行一个初始化配置,主要配置数据访问设备和 ...

最新文章

  1. 【FFmpeg】AVPacket的使用详解
  2. 收集一些好的技术文档
  3. 计算机山西特岗考试题库,山西特岗历年试题
  4. php检测函数是否存在函数 function_exists
  5. android导出excel文件名称,android 导出数据到excel表格文件
  6. 前端---JavaScript基础3
  7. Reindex SQL Server DB table
  8. 别人运行的好好的R代码,到我这怎么就冲突了?
  9. (32) css—opcity属性
  10. 【2】二级C语言中那些易错的概念题
  11. 视频标签- video 音频标签- audio
  12. 2017-09-26 10:45:51.905 ERROR 9704 --- [nio-8080-exec-5] com.linktrust.aspect.AopLogger :
  13. MyBatis源码阅读(五) ---Mapper接口的获取过程
  14. NB-IOT (2)---移远BC26模块模组快速入门
  15. 如何使用PS更换证件照背景色
  16. 数仓建设保姆级5W字教程,离线实时一网打尽(理论+实战)
  17. Ubuntu18.04安装redmine+mysql+nginx+Passenger
  18. 黑群晖内网穿透【免费无公网IP】
  19. 【车载以太网】【SOMEIP】Wireshark测试someip
  20. 给你的Pycharm装一个漂亮的“皮肤“

热门文章

  1. Spring Framework 6正式发布,携JDK 17Jakarta EE开启新篇章
  2. 李笑来《韭菜的自我修养》摘录(1)
  3. 算法题:购买股票(2次交易)
  4. 逆向分析 Android 程序
  5. libcef学习最详细的入门资料系列之一 :libcef基本的入门知识
  6. python城市提取_使用python从文本中提取城市名称
  7. 【微语】第八周(01.04~01.10)
  8. 设置默认网关端口 android,IP设置默认网关的方法 | 192.168.1.1手机登陆
  9. excel宏字符串连接mysql_Excel 访问Sql 数据库的连接字符串
  10. 概率论与数理统计基本知识点总结