复杂点的使用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

https://github.com/ServiceStack/ServiceStack.OrmLite/blob/master/tests/ServiceStack.OrmLite.Tests/LoadReferencesJoinTests.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的更多相关文章

  1. ServiceStack.OrmLite 学习笔记3 建表

    创建表 前一篇忘记写创建表了,这里补上.(其实前一篇也有那么一点) 建议安装源码里的t4模板看看效果先. public 的属性才有效 在表被创建或者删除的时候执行sql语句 [PostCreateTa ...

  2. Android Ormlite 学习笔记1 -- 基础

    Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...

  3. Android Ormlite 学习笔记2 -- 主外键关系

    以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...

  4. ServiceStack.OrmLite 笔记2 -增

    ServiceStack.OrmLite 笔记2 这篇主要介绍 增加 db.Insert(new Employee { Id = 1, Name = "Employee 1" }) ...

  5. ServiceStack.OrmLite 笔记

    ServiceStack.OrmLite 笔记1 ServiceStack.OrmLite 这个东东就是个orm框架,可以实现类似ef的效果.具体的就不这里班门弄斧了. 支持 SqlServerDia ...

  6. ORMLite学习入门笔记

    ORMLite学习入门笔记 使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大.所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLi ...

  7. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  8. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  9. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

随机推荐

  1. c++实现mlp神经网络

    之前一直用theano训练样本,最近需要转成c或c++实现.在网上参考了一下其它代码,还是喜欢c++.但是看了几份cpp代码之后,发现都多少有些bug,很不爽.由于本人编码能力较弱,还花了不少时间改正 ...

  2. 终于有SpringMvc与Struts2的对比啦(转)

    本文转自:http://www.itsource.cn/web/news/5/20150318/370.html 目前企业中使用SpringMvc的比例已经远远超过Struts2,那么两者到底有什么区 ...

  3. Java汉诺塔算法

    汉诺塔问题[又称河内塔]是印度的一个古老的传说. 据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把 ...

  4. Java局部变量final

    局部变量和形参带final. 在一个线程A中开起另一个线程B,如果线程B要使用线程A的局部变量,那么A的局部变量需要定义成final.理由:局部变量是线程内部共享的,每一个线程内的不能访问其他线程的局 ...

  5. Shipyard安装、使用

    Shipyard使用Citadel集群管理工具包,简化对横跨多个主机的Docker容器集群进行管理.通过Web用户界面,你可以大致浏览相关信息,比如你的容器在使用多少处理器和内存资源.在运行哪些容器, ...

  6. require()与 require_once()、 include与include_once()

  7. 搭建LAMP

    RPM包和源码包存放位置 /usr/local/src 源码包编译安装位置 /usr/local/apache /usr/local/mysql /usr/local/php 默认MySQL 数据库位 ...

  8. 20145227《Java程序设计》第10周学习总结

    20145227<Java程序设计>第10周学习总结 教材学习内容总结 网络编程 就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收 ...

  9. [原创]南水之源A*(A-Star)算法

    开发导航之前我看了一些A*(A-Star)算法的例子和讲解.没有求得甚解!不过也从A*(A-Star)算法中得到启发,写了一套自己的A*(A-Star)算法.当然,这不是真正(我也不知道)的A*(A- ...

  10. Python time clock()方法

    描述 Python time clock() 函数以浮点数计算的秒数返回当前的CPU时间.用来衡量不同程序的耗时,比time.time()更有用. 这个需要注意,在不同的系统上含义不同.在UNIX系统 ...