zoukankan      html  css  js  c++  java
  • ServiceStack.OrmLite 笔记8 -还是有用的姿势

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

  • 相关阅读:
    iOS中block实现的探究
    [ES6] 19. for ... of
    [ES6] 18. Map
    [ES6] 17. Set
    [ES6] 16. Object Enhancements
    [MEAN Stack] First API -- 5. Using $resource to setup REST app
    [AngularJS] Provider
    [MEAN Stack] First API -- 4. Organize app structure
    [AngularJS] ngCloak
    [Angular-Scaled Web] 9. Control your promises with $q
  • 原文地址:https://www.cnblogs.com/wang2650/p/5145619.html
Copyright © 2011-2022 走看看