博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Smark.Data 灵活的查询描述
阅读量:6886 次
发布时间:2019-06-27

本文共 2985 字,大约阅读时间需要 9 分钟。

        使用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; }    }
以上是描述一个简单的客户信息,不过想要这个接口生自动生成对应的实体类需要安装一个插件,详细查看 ,最终生成的实体类是接口缺少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
();

自定义对象查询

之前的查询是把表中所有信息填充到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
()) { 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
();

描述关联查询其实很简单,只需要在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
();

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

转载地址:http://bvtbl.baihongyu.com/

你可能感兴趣的文章
Java日志组件间关系
查看>>
聊聊前端国际化文案该如何处理
查看>>
JS难点之hoist
查看>>
“独角兽”企业都爱选择腾讯云,背后原因值得考究
查看>>
浅析 Vue 2.6 中的 nextTick 方法
查看>>
199. Binary Tree Right Side View
查看>>
配置SpringBoot方便的切换jar和war
查看>>
2018最佳GAN论文回顾(下)
查看>>
Vue使用element-ui所遇BUG与需求集结(二)
查看>>
弹性公网EIP,让网络更自由、灵活
查看>>
一对一直播源码都实现了哪几种常见的优化技术? ...
查看>>
Unity学习系列一简介
查看>>
利用Python框架pyxxnet_project实现的网络服务
查看>>
一个最简单的WebSocket hello world demo
查看>>
C# 8.0的三个令人兴奋的新特性
查看>>
关于ip_conntrack跟踪连接满导致网络丢包问题的分析
查看>>
烂泥:linux学习之VNC远程控制(一)
查看>>
如何解决Xshell使用时中文字体是躺倒显示的问题
查看>>
Scala函数的定义的几种写法
查看>>
【iphone应用开发】iphone 应用开发之二:UITextView控件的详细讲解
查看>>