ServiceStack.OrmLite 学习笔记7-复杂点的使用1
复杂点的使用1
先看看这2个类
class Customer {
public int Id { get; set; }
...
}
class CustomerAddress {
public int Id { get; set; }
public int CustomerId { get; set; } // Reference based on Property name convention
}
也支持 别名
[Alias("LegacyCustomer")]
class Customer {
public int Id { get; set; }
...
}
class CustomerAddress {
public int Id { get; set; }
[Alias("LegacyCustomerId")] // Matches `LegacyCustomer` Alias
public int RenamedCustomerId { get; set; } // Reference based on Alias Convention
}
1对1 直接引用CustomerAddress 爽了很多
public class Customer
{
...
public int CustomerAddressId { get; set; }
[Reference]
public CustomerAddress PrimaryAddress { get; set; }
}
外键和引用属性
public class Customer
{
[References(typeof(CustomerAddress))]
public int PrimaryAddressId { get; set; }
[Reference]
public CustomerAddress PrimaryAddress { get; set; }
}
多搞几个外键
public class Customer
{
[AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
[References(typeof(CustomerAddress))]
public int? HomeAddressId { get; set; }
[References(typeof(CustomerAddress))]
public int? WorkAddressId { get; set; }
[Reference]
public CustomerAddress HomeAddress { get; set; }
[Reference]
public CustomerAddress WorkAddress { get; set; }
}
这是官网的例子 建议执行后到数据库里看看,跟踪下数据和语句
ar customer = new Customer
{
Name = "The Customer",
HomeAddress = new CustomerAddress {
Address = "1 Home Street",
Country = "US"
},
WorkAddress = new CustomerAddress {
Address = "2 Work Road",
Country = "UK"
},
};
db.Save(customer, references:true);
var c = db.LoadSelect(q => q.Name == "The Customer");
c.WorkAddress.Address.Print(); // 2 Work Road
var ukAddress = db.Single(q => q.Country == "UK");
ukAddress.Address.Print(); // 2 Work Road
join
var dbCustomers = db.Select(q => q.Join());//注意表的关联 尤其是id字段(表CustomerAddress有一个名为CustomerId的字段,对应Customer表的id字段)
SELECT Customer.* FROM Customer
INNER JOIN
CustomerAddress ON (Customer.Id == CustomerAddress.Id)
还可以
SqlExpression q = db.From();
q.Join<Customer,CustomerAddress>((cust,address) => cust.Id == address.CustomerId);
List dbCustomers = db.Select(q);
也可以这样写(不写条件,隐式的关联), 不过最好还是显示的把条件写出来。
q.Join();
q.Join<Customer,CustomerAddress>();
q.Join<Customer,CustomerAddress>((cust,address) => cust.Id == address.CustomerId);
多表的多列
List customers=db.Select < FullCustomerInfo > (db.From< Customer >().Join < CustomerAddress > ());
等同
var customers = db.Select < FullCustomerInfo,Customer > (q = > q.Join < CustomerAddress > ());
Customer是表名 Id是字段名 下面的四个知道是什么意思了吧
CustomerId => "Customer"."Id"
OrderId => "Order"."Id"
CustomerName => "Customer"."Name"
OrderCost => "Order"."Cost"
群people乱舞
List rows = db.Select( // 结果匹配FullCustomerInfo
db.From() // 起始 Customer
.LeftJoin() // 左联接CustomerAddress 没加条件哦 隐式的关联了
.Join<Customer, Order>((c,o) => c.Id == o.CustomerId) // join链接 order 这个加了条件 on
.Where(c => c.Name == "Customer 1") // 基本表Customer的条件
.And(o => o.Cost < 2) // 对 Order加条件
.Or<Customer,Order>((c,o) => c.Name == o.LineItem)); // 用的是or呦 关联条件 是where里的条件
还是要看看这个 左联接 有链接什么的
https://github.com/ServiceStack/ServiceStack.OrmLite/blob/master/tests/ServiceStack.OrmLite.Tests/LoadReferencesTests.cs
是否保存引用的表记录
var customer = new Customer {
Name = "Customer 1",
PrimaryAddress = new CustomerAddress {
AddressLine1 = "1 Australia Street",
Country = "Australia"
},
Orders = new[] {
new Order { LineItem = "Line 1", Qty = 1, Cost = 1.99m },
new Order { LineItem = "Line 2", Qty = 2, Cost = 2.99m },
}.ToList(),
};
db.Save(customer, references:true);
Load* 通过id加载一条记录 并且加载关联的子表的记录
var customer = db.LoadSingleById(customerId);
下面的这句也能明了的吧。select和SingleById的区别
var customers = db.LoadSelect(q => q.Name == "Customer 1");
更多 请看https://github.com/ServiceStack/ServiceStack.OrmLite/blob/master/tests/ServiceStack.OrmLite.Tests/LoadReferencesTests.cs
Merge 的使用 合并不连贯的结果集合
List customers = db.Select(q =>
q.Join()
.Where(o => o.Qty >= 10)
.SelectDistinct());
上面的是客户集合
List orders = db.Select(o => o.Qty >= 10);
上面的是订单集合
customers.Merge(orders); 这句用来合体
customers.PrintDump(); 打印下或者查询下结果。订单被关联到客户了。 孤儿得到救助。
注:没测试,关联不到的,可能被抛弃了?。
没试过, 隐式的,万一是凤姐咋办
var customerWithAddress = db.LoadSingleById(customer.Id, include: new[] { "PrimaryAddress" });
版本号
public class Poco
{
...
public ulong RowVersion { get; set; }
}
sqlserver 是RowVersion 类型
Uses PostgreSql's xmin system column (no column on table required)
Uses UPDATE triggers on MySql, Sqlite and Oracle whose lifetime is attached to Create/Drop tables APIs
蛋疼 就是加一列好了
db.DeleteById(id:updatedRow.Id, rowversion:updatedRow.RowVersion)
判断版本号
更新和删除试试 看看版本号的变化
var rowId = db.Insert(new Poco { Text = "Text" }, selectIdentity:true);
var row = db.SingleById(rowId);
row.Text += " Updated";
db.Update(row); //success!
row.Text += "Attempting to update stale record";
//Can't update stale record
Assert.Throws(() =>
db.Update(row));
//Can update latest version
var updatedRow = db.SingleById(rowId); // fresh version
updatedRow.Text += "Update Success!";
db.Update(updatedRow);
updatedRow = db.SingleById(rowId);
db.Delete(updatedRow);
手洗
List Select(string sql, IEnumerable sqlParams)
T Single(string sql, IEnumerable sqlParams)
T Scalar(string sql, IEnumerable sqlParams)
List Column(string sql, IEnumerable sqlParams)
IEnumerable ColumnLazy(string sql, IEnumerable sqlParams)
HashSet ColumnDistinct(string sql, IEnumerable sqlParams)
Dictionary<K, List> Lookup<K, V>(string sql, IEnumerable sqlParams)
List SqlList(string sql, IEnumerable sqlParams)
List SqlColumn(string sql, IEnumerable sqlParams)
T SqlScalar(string sql, IEnumerable sqlParams)
IDbDataParameter pAge = db.CreateParam("age", 40, dbType:DbType.Int16);
db.Select("SELECT * FROM Person WHERE Age > @pAge", new[] { pAge });
ServiceStack.OrmLite 学习笔记7-复杂点的使用1的更多相关文章
- ServiceStack.OrmLite 学习笔记3 建表
创建表 前一篇忘记写创建表了,这里补上.(其实前一篇也有那么一点) 建议安装源码里的t4模板看看效果先. public 的属性才有效 在表被创建或者删除的时候执行sql语句 [PostCreateTa ...
- Android Ormlite 学习笔记1 -- 基础
Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...
- Android Ormlite 学习笔记2 -- 主外键关系
以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...
- ServiceStack.OrmLite 笔记2 -增
ServiceStack.OrmLite 笔记2 这篇主要介绍 增加 db.Insert(new Employee { Id = 1, Name = "Employee 1" }) ...
- ServiceStack.OrmLite 笔记
ServiceStack.OrmLite 笔记1 ServiceStack.OrmLite 这个东东就是个orm框架,可以实现类似ef的效果.具体的就不这里班门弄斧了. 支持 SqlServerDia ...
- ORMLite学习入门笔记
ORMLite学习入门笔记 使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大.所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLi ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
随机推荐
- android 学习随笔二十九(自定义监听 )
package com.itheima.momo.dialog; import com.itheima.momo.R; import android.app.AlertDialog; import a ...
- android 学习随笔二十八(应用小知识点小结 )
去掉标题栏的方法 第一种:也一般入门的时候经常使用的一种方法requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏注意这句一定要写在setConte ...
- 【python cookbook】【数据结构与算法】5.实现优先级队列
问题:要实现一个队列,它能够以给定的优先级对元素排序,且每次pop操作时都会返回优先级最高的那个元素: 解决方案:采用heapq模块实现一个简单的优先级队列 # example.py # # Exam ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.8.SportsStore:管理
管理功能,如何身份认证,对controller和action方法过滤安全的访问,并在用户需要时提供证书. 1 添加分类管理 方便管理的controller,有两类页面,List页面和edit页面. 1 ...
- [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。
1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...
- MySQL重置root用户密码的方法
本教程适用于采用Win2003.WinXP操作系统的迅美VPS和云主机产品. 当管理员忘记MySQL密码怎么办?屡次输入密码,仍然提示错误,网站无法正常运行,数据库也无法管理,管理员束手无策. 网站程 ...
- 用PHP判断远程图片(文件)是否存在
<?php function check_remote_file_exists($url) { $curl = curl_init($url); // 不取回数据 curl_setopt($cu ...
- MD5加密,Base64加密/解密,AES加密/解密
1.从github上下载GTMBase64-master和AESCrypt-ObjC-master导入工程,如下图所示. 2.使用前的配置及注意事项: (1) 在build phases中的GTMBa ...
- [Ogre][地形]OgreTerrain分析以及使用
Ogre 1.7.2中的地形教程 ○读者可以对照着Ogre1.7.2中的terrain.h源码进行阅读加深理解,蓝色部分均为源码 ○去除了一些具体场景比如添加mesh,设置setAmbientLigh ...
- [C++][代码库]Vector3空间向量类
本文用C++实现一个简单的Vector3类的功能,暂时有的功能是: 1 + - * /算术运算 2 向量的数量积,又叫:点乘 3 向量的向量积,又叫:叉乘 4 向量单位化(normalization) ...