上篇介绍集成第三方Sql数据库时未实现如导航属性、子查询等功能,经过大半个月的努力作者初步实现了这些功能,基本上能满足80%-90%查询需求,特别复杂的查询可以用原生sql来处理,下面分别示例介绍。

Like/In/NotIn

public async Task<object> Query()
{
var codes = new string[] { "001", "003" };
var q = new SqlQuery<Entities.OrderItem>();
q.Where(t => t.ProductCode.In(codes));
q.AndWhere(t => t.Product.Name.Contains("Pro"));
return await q.ToListAsync();
}
Select t."OrderId",t."ProductCode",t."Quantity" From "OrderItem" t Left Join "Product" j1 On j1."Code"=t."ProductCode" Where t."ProductCode" In (@p1,@p2) And j1."Name" Like @p3

分页查询

public async Task<object> Query()
{
var q = new SqlQuery<Entities.OrderItem>();
q.Where(t => t.Quantity > 0);
q.OrderBy(t => t.ProductCode);
q.Skip(2).Take(2);
var totalRows = await q.CountAsync();
return await q.ToListAsync();
}
Select Count(*) From "OrderItem" t Where t."Quantity" > @p1

Select t."OrderId",t."ProductCode",t."Quantity" From "OrderItem" t Where t."Quantity" > @p1 Order By t."ProductCode" Offset 2 Limit 2

EntityRef属性自动Left Join

  适用于实体建模时指定了EntityRef(一对一关系)。

public async Task<object> Query()
{
var q = new SqlQuery<Entities.Customer>();
q.Where(t => t.City.Name == "无锡");
return await q.ToListAsync(t => new { t.Id, t.Name, CityName = t.City.Name });
}
Select t."Id",t."Name",j1."Name" "CityName" From "Customer" t Left Join "City" j1 On j1."Code"=t."CityCode" Where j1."Name" = @p1

手工Join

  适用于实体建模时未指定EntityRef关系。

public async Task<object> Query()
{
var q = new SqlQuery<Entities.Customer>();
var j = new SqlQueryJoin<Entities.City>(); q.LeftJoin(j, (cus, city) => cus.CityCode == city.Code);
q.Where(j, (cus, city) => city.Name == "无锡");
return await q.ToListAsync(j, (cus, city) => new { cus.Id, cus.Name, CityName = city.Name });
}
Select t."Id",t."Name",j1."Name" "CityName" From "Customer" t Left Join "City" j1 On j1."Code"=t."CityCode" Where j1."Name" = @p1

GroupBy分组

public async Task<object> Query()
{
var q = new SqlQuery<Entities.OrderItem>();
q.GroupBy(t => t.ProductCode)
.Having(t => DbFuncs.Sum(t.Quantity) > 0);
return await q.ToListAsync(t => new { t.ProductCode, Amount = DbFuncs.Sum(t.Quantity) });
}
Select t."ProductCode",Sum(t."Quantity") "Amount" From "OrderItem" t Group By t."ProductCode" Having Sum(t."Quantity") > @p1

SubQuery子查询

public async Task<object> Query()
{
var q = new SqlQuery<Entities.OrderItem>();
var s = new SqlQuery<Entities.Product>(); q.Where(t => t.ProductCode.In(
s.Where(p => p.Name.Contains("15")).AsSubQuery(p => p.Code)
));
return await q.ToListAsync();
}
Select t."OrderId",t."ProductCode",t."Quantity" From "OrderItem" t Where t."ProductCode" In (Select t1."Code" From "Product" t1 Where t1."Name" Like @p1)

Eager loading预先加载

  适用于SqlQuery.ToSingleAsync()及ToListAsync()。注意以下示例加载EntitySet属性,会单独生成Sql,所以不建议ToListAsync()时预先加载EntitySet属性,更不建议嵌套预先加载EntitySet。

public async Task<object> Query()
{
var q = new SqlQuery<Entities.Order>();
q.Include(order => order.Customer)
.ThenInclude(customer => customer.City)
.Include(order => order.Items)
.ThenInclude(item => item.Product);
return await q.ToSingleAsync();
}
Select t."Id",t."CustomerId",j1."Id" "Customer.Id",j1."Name" "Customer.Name",j1."CityCode" "Customer.CityCode",j1."Phone" "Customer.Phone",j2."Code" "Customer.City.Code",j2."Name" "Customer.City.Name" From "Order" t Left Join "Customer" j1 On j1."Id"=t."CustomerId" Left Join "City" j2 On j2."Code"=j1."CityCode" Limit 1

Select t."OrderId",t."ProductCode",t."Quantity",j1."Code" "Product.Code",j1."Name" "Product.Name",j1."Unit" "Product.Unit" From "OrderItem" t Left Join "Product" j1 On j1."Code"=t."ProductCode" Where t."OrderId" = @p1

暂未实现Explicit loading(显式加载);

暂不支持Lazy loading(延迟加载)

更新同时返回值 [2020-02-19更新]

  适用于扣减库存同时返回扣减后的值,以判断是否超出库存数量。

public async Task Subtract(int itemId, int amount)
{
using var conn = await DataStore.Default.OpenConnectionAsync();
using var txn = conn.BeginTransaction();
var upcmd = new SqlUpdateCommand<Entities.TestStocks>();
upcmd.Update(t => t.Amount = t.Amount - amount);
upcmd.Where(t => t.ItemId == itemId);
//var outs = upcmd.Output(t => new { t.ItemId, t.Amount });
var outs = upcmd.Output(t => t.Amount); //在下句执行前指定返回值
await DataStore.Default.ExecCommandAsync(upcmd, txn); //显式指定事务执行
if (outs.Count != 1 || outs[0] < 0) //在执行后检查返回结果
throw new Exception("库存不足");
txn.Commit(); //成功递交事务
}
Update "sys.TestStocks" t Set "Amount" = "Amount" + @p1 Where t."ItemId" = @p1 RETURNING "Amount"

小结

  GitHub上的运行时已更新可安装测试,作者下一步重点是实现独立的不依赖内置存储的版本,并且实现模型包的导入与导出功能。另一边码代码一边码文实属不易,作者需要您的支持请您多多点赞推荐!

AppBoxFuture: Sql存储的ORM查询示例的更多相关文章

  1. SQL Server-简单查询示例(十一)

    前言 本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解,Always to review the basics. EOMONTH 在SQL Server 2012的教程示例中 ...

  2. 第二十篇ORM查询与SQL语句

    ORM查询与SQL语句 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情 ...

  3. Django(17)orm查询操作

    前言 查找是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时候传递不同的参数来实现查询需求.在ORM层面,这些查询条件都 ...

  4. Django基础四之测试环境和ORM查询

    Django基础四之测试环境和ORM查询 目录 Django基础四之测试环境和ORM查询 1. 搭建测试环境 1.1 测试环境搭建方法: 1.2 使用测试环境对数据库进行CURD 1.3 返回Quer ...

  5. SQL Server T-SQL高级查询

    name like 'ja%'; select * from student where name not like '%[j,n]%'; select * from student where na ...

  6. 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...

  7. ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )

    必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...

  8. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

  9. ORM查询简化

    文章出处 https://www.cnblogs.com/wupeiqi/articles/6216618.html 字段 常用字段 AutoField(Field) - int自增列,必须填入参数 ...

随机推荐

  1. Spring整合MyBatis案例练习笔记

    需求: 用户登录 技术需求: Servlet+Spring+Mybatis+MVC+jsp+css+html+jquery 数据库设计: 用户表 Sql语句设计: select * from t_us ...

  2. 到头来还是逃不开Java - Java13核心类

    Java13核心类 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来 ...

  3. 【动态规划】【C/C++】简单的背包问题

    简单的背包问题 背包问题动态规划中非常经典的一个问题,本文只包含01背包,完全背包和多重背包.更加详尽的背包问题的讲解请参考崔添翼大神的<背包九讲> 简单的01背包 问题导入:新年到了,m ...

  4. QQ第三方登录(二)

    首先我们先来看一下我的目录 Connect2.1  是我们从下载的SDK,内容包含 其他文件在配置之后全部删除了! index.html 是我们点击登陆的页面(以下为html中的代码) <cen ...

  5. Python入门5 —— 基本运算符

    1.算数运算符('+'.'-'.'*'.'/'.'//'.'%'.'**') print(10 + 3) -- 输出:13 print(10 - 3) -- 输出:7 print(10 * 3) -- ...

  6. OpenTLD相关资料

    这是一位来自奥地利的博士生的博客 他的介绍如下: I am a PhD student at the Safety and Security Department of the Austrian In ...

  7. Java EE 7 API

    学习Java必备资源,下载链接: https://pan.baidu.com/s/1P1xzuoGJCIuZlYBbPSbM_Q 提取码: dtui 复制这段内容后打开百度网盘手机App,操作更方便哦

  8. 在多租户(容器)数据库中如何创建PDB:方法2 克隆本地PDB

    基于版本:19c (12.2.0.3) AskScuti 创建方法:克隆本地PDB(从本地其他PDB创建新的PDB) 对应路径:Creating a PDB --> Cloning --> ...

  9. C#画图超出屏幕的部分无法显示的解决方法

    C#画图超出屏幕的部分无法显示,通过AutoScrollMinSize属性及相关方法解决问题. 可以实现 到 的转变. 代码如下: using System.Drawing; using System ...

  10. Django REST framework快速入门(官方文档翻译翻译)

    开始 我们将创建一个简单的API来允许管理员用户查看和编辑系统中的用户和组. 项目设置 创建一个新的django项目,命名为:<tutorial>,然后创建一个新的应用程序(app),命名 ...