复杂点的使用2


InsertAll, UpdateAll and DeleteAll 的参数要是IEnumerables


Each关键字 返回 IEnumerable 并且是延迟加载的


全局设置 当字符串为null时候,设置一个默认值

OrmLiteConfig.OnDbNullFilter = fieldDef = >

fieldDef.FieldType == typeof(string) ? "NULL" : null;

执行sql的时候过滤

public class MockStoredProcExecFilter : OrmLiteExecFilter

{

public override T Exec(IDbConnection dbConn, Func<IDbCommand, T> filter)

{

try

{

return base.Exec(dbConn, filter);

}

catch (Exception ex)

{

if (dbConn.GetLastSql() == "exec sp_name @firstName, @age")

return (T)(object)new Person { FirstName = "Mocked" };

throw;

}

}

}

OrmLiteConfig.ExecFilter = new MockStoredProcExecFilter();

using (var db = OpenDbConnection())

{

var person = db.SqlScalar("exec sp_name @firstName, @age",

new { firstName = "aName", age = 1 });

person.FirstName.Print(); //Mocked

}


CaptureSqlFilter

跟踪 可以在调试窗口看到了

using (var captured = new CaptureSqlFilter())

using (var db = OpenDbConnection())

{

db.Where(new { Age = 27 });

captured.SqlStatements[0].PrintDump();

}


同上 重复执行

public class ReplayOrmLiteExecFilter : OrmLiteExecFilter

{

public int ReplayTimes { get; set; }

public override T Exec<T>(IDbConnection dbConn, Func<IDbCommand, T> filter)
{
var holdProvider = OrmLiteConfig.DialectProvider;
var dbCmd = CreateCommand(dbConn);
try
{
var ret = default(T);
for (var i = 0; i < ReplayTimes; i++)
{
ret = filter(dbCmd);
}
return ret;
}
finally
{
DisposeCommand(dbCmd);
OrmLiteConfig.DialectProvider = holdProvider;
}
}

}

OrmLiteConfig.ExecFilter = new ReplayOrmLiteExecFilter { ReplayTimes = 3 };

using (var db = OpenDbConnection())

{

db.DropAndCreateTable();

db.Insert(new PocoTable { Name = "Multiplicity" });

var rowsInserted = db.Count<PocoTable>(q => q.Name == "Multiplicity"); //3

}


单元测试 模拟返回的数据

下面返回的数据都是假的,山寨的

using (new OrmLiteResultsFilter {

PrintSql = true,

SingleResult = new Person {

Id = 1, FirstName = "Mocked", LastName = "Person", Age = 100

},

})

{

db.Single(x => x.Age == 42).FirstName // Mocked

db.Single(db.From().Where(x => x.Age == 42)).FirstName // Mocked

db.Single(new { Age = 42 }).FirstName // Mocked

db.Single("Age = @age", new { age = 42 }).FirstName // Mocked

}


一看就懂 字符串过滤 还有这玩意居然

OrmLiteConfig.StringFilter = s => s.TrimEnd();

db.Insert(new Poco { Name = "Value with trailing " });

db.Select().First().Name // "Value with trailing"


可插入 可拔出的 复杂类型序列化

据说ServiceStack's的json序列化效率最高

//ServiceStack's JSON and JSV Format

SqliteDialect.Provider.StringSerializer = new JsvStringSerializer();

PostgreSqlDialect.Provider.StringSerializer = new JsonStringSerializer();

//.NET's XML and JSON DataContract serializers

SqlServerDialect.Provider.StringSerializer = new DataContractSerializer();

MySqlDialect.Provider.StringSerializer = new JsonDataContractSerializer();

//.NET XmlSerializer

OracleDialect.Provider.StringSerializer = new XmlSerializableSerializer();

code first的时候会用到吧

public class PocoTable

{

public int Id { get; set; }

[CustomField("CHAR(20)")]
public string CharColumn { get; set; } [CustomField("DECIMAL(18,4)")]
public decimal? DecimalColumn { get; set; }

}

db.CreateTable();

结果:CREATE TABLE "PocoTable"

(

"Id" INTEGER PRIMARY KEY,

"CharColumn" CHAR(20) NULL,

"DecimalColumn" DECIMAL(18,4) NULL

);


可以这样调用存储过程的

List results = db.SqlList("EXEC GetAnalyticsForWeek 1");

List results = db.SqlList(

"EXEC GetAnalyticsForWeek @weekNo", new { weekNo = 1 });

List results = db.SqlList("EXEC GetTotalsForWeek 1");

List results = db.SqlList(

"EXEC GetTotalsForWeek @weekNo", new { weekNo = 1 });

int result = db.SqlScalar("SELECT 10");

搞个带参数的存储过程

string spSql = @"DROP PROCEDURE IF EXISTS spSearchLetters;

CREATE PROCEDURE spSearchLetters (IN pLetter varchar(10), OUT pTotal int)

BEGIN

SELECT COUNT(*) FROM LetterFrequency WHERE Letter = pLetter INTO pTotal;

SELECT * FROM LetterFrequency WHERE Letter = pLetter;

END";

db.ExecuteSql(spSql);

using (var cmd = db.SqlProc("spSearchLetters", new { pLetter = "C" }))

{

var pTotal = cmd.AddParam("pTotal", direction: ParameterDirection.Output);

var results = cmd.ConvertToList<LetterFrequency>();
var total = pTotal.Value;

}

换个姿势加参数

IDbDataParameter pTotal = null;

var results = db.SqlList("spSearchLetters", cmd => {

cmd.CommandType = CommandType.StoredProcedure;

cmd.AddParam("pLetter", "C");

pTotal = cmd.AddParam("pTotal", direction: ParameterDirection.Output);

});

var total = pTotal.Value;


设置字段的默认值 g点在这里OrmLiteVariables

public class Poco

{

[Default(OrmLiteVariables.SystemUtc)] //= {SYSTEM_UTC}

public DateTime CreatedTimeUtc { get; set; }

}

ServiceStack.OrmLite 笔记8 -还是有用的姿势的更多相关文章

  1. ServiceStack.OrmLite 笔记2 -增

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

  2. ServiceStack.OrmLite 笔记

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

  3. ServiceStack.OrmLite 笔记9 -code first 必须的代码优先

    复杂点的使用3 code first的使用,支持复杂类型 public enum PhoneType { Home, Work, Mobile, } public enum AddressType { ...

  4. ServiceStack.OrmLite 笔记4 删

    删除 db.DeleteAll(); //各种姿势 db.Delete(p => p.Age == 27);// db.Delete(q => q.Where(p => p.Age ...

  5. ServiceStack.OrmLite 笔记10-group having 分页orderby等

    group having 分页等 var ev = OrmLiteConfig.DialectProvider.SqlExpression(); group的使用 同sql一样,注意group分组的字 ...

  6. ServiceStack.OrmLite 笔记5 改

    修改 db.Update(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age ...

  7. ServiceStack.OrmLite 学习笔记7-复杂点的使用1

    复杂点的使用1 先看看这2个类 class Customer { public int Id { get; set; } ... } class CustomerAddress { public in ...

  8. ServiceStack.OrmLite

    ServiceStack.OrmLite 谈谈我的入门级实体框架Loogn.OrmLite   每次看到有新的ORM的时候,我总会留意一下,因为自己也写过一个这样的框架,人总是有比较之心的.我可能会d ...

  9. ServiceStack.OrmLite中的一些"陷阱"(2)

    注:此系列不是说ServiceStack.OrmLite的多个陷阱,这仅仅个人认为是某一个陷阱(毕竟我踩坑了)而引发的思考. 前文说到了项目需要使用两种不同的数据库语言,虽说前文问题已基本解决了,但是 ...

随机推荐

  1. Mongodb 笔记05 创建副本集

    创建副本集 1. 副本集:副本集时一组服务器,其中有一个主服务器(primary),用于处理客户端请求:还有多个备份服务器(secondary),用于保存主服务器的数据副本.如果主服务器崩溃了,备份服 ...

  2. python随机数的使用记录

    一.random模块简介 Python标准库中的random函数,可以生成随机浮点数.整数.字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等. 二.random模块重要函数 1 ).ra ...

  3. 为 Macbook 安装 wget 命令

    没想到装个这个命令那么麻烦, 还要装 xcode?..... 好吧,按步骤来成功装上 http://www.arefly.com/mac-wget/ 其實Mac也自帶了一個Curl同樣也可以下載網頁, ...

  4. lamp环境编译(apache2.4.7 php5.4.25 mysql 5.5.23)

    环境要求 gcc.gcc-c++.cmake.bison(可能)支持 1.yum install gcc gcc-c++ cmake bison 2.修改yum配置,达到搜索本地设置 移走或改名/et ...

  5. DateTimeUtil 工具类,android 和 java 通用

    import java.sql.Date;import java.text.SimpleDateFormat; public class DateTimeUtil { public final cla ...

  6. 使用BBCP来提升跨互联网的数据传输速度

    背景介绍: 目前项目在美国东西部以及欧洲都有服务器节点,跨互联网的数据传输速度很不稳定,之前我们主要是通过SCP以及Rsync等方式进行数据传输的. 无意间发现了BBCP这个软件之后,经过测试,效果非 ...

  7. 创建sh文件

    创建sh文件 #/bin/bash v_file=$ v_type=$ v_desc=$ touch $v_file echo '#================================== ...

  8. DockerUI安装、使用

    虽然大多数开发人员和管理人员通过命令行来创建及运行Docker容器,但Docker的Remote API让他们可以通过充分利用REST(代表性状态传输协议)的API,运行相同的命令.这时,Docker ...

  9. 7、XML加强/Web开发/Tomcat

    1 XML加强 XML加强 1)Dom4j修改XML文档 写出xml文档: XMLWriter writer = new XMLWriter() writer.wrtite(doc); 增加: Doc ...

  10. Codeforces 735D:Taxes(哥德巴赫猜想)

    http://codeforces.com/problemset/problem/735/D 题意:给出一个n,这个n可以分解成 n = n1 + n2 + -- + nk,其中k可以取任意数.要使得 ...