Shaolinq, 面向. NET的ORM,支持 Postgres SQLite MySql和 sql server的完整LINQ支持

作者:无名 - GitHub -

  • 源代码名称:shaolinq
  • 源代码网址:http://www.github.com/tumtumtum/shaolinq
  • shaolinq源代码文档
  • shaolinq源代码下载
  • git url:
    git://www.github.com/tumtumtum/shaolinq.git
  • git clone代码到本地:
    git clone http://www.github.com/tumtumtum/shaolinq
  • subversion代码到本地:
    $ svn co --depth empty http://www.github.com/tumtumtum/shaolinq

    checked out revision 1.

    $ cd repo

    $ svn up trunk

  • shaolinq

    shaolinq是一个强大的orm和 c# 和. net的linq提供程序。 它为linqtosql和 entity framework 提供了一个深思熟虑。快速和强大的替代方案。

    显著的功能:

    • 代码第一个对象模型
    • 所有 entity framework 支持和超越的顶级类linq支持
    • 第一类复合主键支持
    • 使用属性或者配置按约定完全配置命名
    • 对异步/等待的完全支持,这超出了 entity framework的可能
    • 完全支持递归包括集合属性- 处理所有必需和复杂的join
    • 自动创建架构和迁移
    • 利用linq实现高层次和super-fine-grained访问的自然对象模型体系结构
    • 使用动态生成的代码( system.reflection.emit ),以避免动态反射调用( 动态调用被大多数它的他vmm使用)。
    • 自动linq查询缓存以避免慢labmda表达式编译时间
    • 真正抽象的对象和查询模型: 基于单个代码,多个后端
    • 在对象模型和linq中支持的许多关系和许多关系
    • advanced支持包括自然支持服务器端函数和操作,包括像和 c# 操作 converstions,如自然语言中的和 toupper() 操作
    • 支持不只是选择和删除使用基于linq的语法的对象集
    • 对 sqlite,mysql和postgres以及 sql server的一流支持
    • 支持客户端计算属性值,在必要时自动执行性能关键反规范化
    • 轻松支持具有完整linq支持的新提供者( 代码代码少于 100行)
    • 自然事务模型。对象图被保存起来并单独保存对象是过去的事情。
    • 独特的压缩参考架构,允许部分对象更新和引用,但大多数的orm都需要

    动机:

    在第1 章中,缺少合适的免费代码,支持 2007的主要开源数据库,motivated我设计了一个基于 c# 操作符重载的查询系统来设计新的query。 在in中,在. net 3.5中发布linq后,我在 2008中添加了linq支持。 shaolinq的主要目标是:

    • 代码第一个对象模型
      • 当可以编写 c# 时为什么编写 xml?
      • 如果可以编写 c#,为什么编写 sql?
    • 接近或者快于使用sql的性能
    • 避免反射:在. net 中推进bare-to-the-metal代码的边界
    • 跟踪和commiting在属性/列级别进行更改而不是对象级别。 更改对象的单个属性应该只为相应列生成更新语句。
    • 自动缓存预编译的linq查询支持
    • 支持执行存储过程并将它的投影到对象
    • 所见即所得模式
      • 模式看起来不应该是为orm设计
    • 永远不要生成特殊列或者特殊表。
      • 对象模型的对象特性不应该破坏数据库模式的关系特性
      • 使用任何现有的数据库模式都应该很容易,而不需要任何特殊的映射。
    • 全面的linq支持
    • 完全支持linq作为第一类主要查询语言,与只支持基选择和子句子句的其他orm不同
    • 支持新数据库非常容易
    • 向orm添加新提供者不需要理解 linq。表达式树等。
    • 支持 sqlite,mysql和postgres和 sql servver
    • 只需要对 switch 底层数据库提供程序进行配置( web.config ) 更改

    代码

    定义数据模型:

    //object inheriting from generic dataaccessobject to get"id" primary key property

    [dataaccessobject]

    public abstract class person : dataaccessobjectlt;guidgt;

    {

    [autoincrement]

    [persistedmember]

    public abstract guid id { get; set; }

    [persistedmember]

    public datetime birthdate {get; set; }

    [persistedmember]

    public abstract int age { get; set; }

    [persistedmember]

    public abstract string name { get; set; }

    [persistedmember]

    public abstract person bestfriend { get; set; }

    [backreference]

    public abstract borrowedbook { get; set; }

    [description]

    [index(lowercaseindex = true)]

    [computedtextmember("{name} of age {age}")]

    public abstract string description { get; set; }

    }

    //object inheriting from non generic dataaccessobject to manually define its own primary keys

    [dataaccessobject]

    public abstract book : dataaccessobject

    {

    [primarykey("$(type_name)$(property_name)")]

    [persistedmember]

    public abstract long serialnumber { get; set; }

    [primarykey]

    [persistedmember]

    public abstract string publishername { get; set; }

    [persistedmember]

    public abstract string title { get; set; }

    [relateddataaccessobjects]

    public abstract relateddataaccessobjectslt;persongt; borrowers { get; }

    }

    //the data access model - defines all types/tables

    [dataaccessmodel]

    public abstract class examplemodel : dataaccessmodel

    {

    [dataaccessobjects]

    public abstract dataaccessobjectslt;bookgt; books { get; }

    [dataaccessobjects]

    public abstract dataaccessobjectslt;persongt; people { get; }

    }

    创建sqlite数据库:

    using shaolinq;

    using shaolinq.sqlite;

    static void main()

    {

    var configuration = sqliteconfiguration.create(":memory:");

    var model = dataaccessmodel.builddataaccessmodellt;examplemodelgt;(configuration);

    model.create(databasecreationoptions.deleteexistingdatabase);

    }

    创建mysql数据库:

    using shaolinq;

    using shaolinq.mysql;

    static void main()

    {

    var configuration = = mysqlconfiguration.create("exampledatabase", "localhost", "root", "root");

    var model = dataaccessmodel.builddataaccessmodellt;examplemodelgt;(configuration);

    model.create(databasecreationoptions.deleteexistingdatabase);

    }

    插入对象:

    using (var scope = new dataaccessscope())

    {

    var person = model.people.create();

    person.name ="steve";

    scope.complete();

    }

    //使用分布式事务插入对象

    using (var scope = new transactionscope())

    {

    var person = model.people.create();

    person.name ="steve";

    person.age = 18;

    scope.complete();

    }

    异步插入对象:

    using (var scope = new dataaccessscope())

    {

    var person = model.people.create();

    person.name ="steve";

    person.age = 18;

    await scope.completeasync();

    }

    不需要执行select查询即可异步更新对象:

    using (var scope = new dataaccessscope())

    {

    //gets a reference to an object with a composite primary key without hitting the database

    var book = model.books.getreference(new { id = 100, publishername ="penguin" });

    book.title ="expert shaolinq";

    //will throw if the book (上面) does not exist on commit in a single trip to the database

    await scope.completeasync();

    }

    使用包含的隐式联接执行查询和显式联接。 对所有图书和每个借书者进行查询,并为每个借款人提供他们最好的朋友。 然后打印出借款人和他们最好的朋友的名字。

    var books = await model.books.include(c =gt; c.borrowers.includeditems().bestfriend).tolistasync();

    foreach (var value in books.borrowers.items().selectmany(c =gt; new { c.name, bestfriendname = c.bestfriend.name })))

    {

    console.writeline($"borrower: {value.name} bestfriend: {value.bestfriend.name}")

    }

    异步查找数据库中所有人员的年龄

    var averageage = await model.people.averageasync(c =gt; c.age);

    console.writeline($"average age is {averageage}");

    使用linq语法从数据库中删除所有名为steve的人

    using (var scope = new dataaccessscope())

    {

    await model.people.where(c =gt; c.name =="steve").deleteasync();

    //or

    await model.people.deleteasync(c =gt; c.name == "steve");

    console.writeline("deleted all people named steve");

    await scope.completeasync();

    }

    异步枚举 name 以快速服务器端不敏感索引为起点的所有用户

    using (var enumerator = model.people.where(c =gt; c.description.tolower().startswith("steve")).getasyncenumerator())

    {

    while (await enumerator.movenextasync())

    {

    console.writeline($"name: {enumerator.current.name}");

    }

    }

    使用select进行更新的//查询( 锁定单个行)

    using (var scope = new dataaccessscope())

    {

    var person = await model.people.selectforupdateasync(c =gt; c.name =="steve");

    person.age = 19;

    await scope.completeasync();

    }

    查找 name 中包含'两种不同方式server的人

    var people1 = await model.people.where(c =gt; c.name.islike("%s%")).tolistasync();

    var people2 = await model.people.where(c =gt; c.name.indexof("s")gt; = 0).tolistasync();

    打印所有有一个bestfriend的人的名字,他的是""

    //will perform automatic implicit left join on bestfriend

    var people = await model

    . people

    . where(c =gt; c.bestfriend.bestfriend.name == "steve")

    . witheachasync(console.writeline);

    如果你知道对象主键,而不查询最好的朋友,请指定最好的朋友朋友。

    using (var scope = new dataaccessscope())

    {

    //no query performed

    var person1 = model.people.gereference(personid);

    //no query performed

    person1.bestfriend = model.people.getreference(bestfriendid);

    //a single update statement is performed

    await scope.completeasync();

    }

    使用服务器端日期功能查找在十二月出生的所有人员

    var people = await model.where(c =gt; c.birthdate.year == 12).tolistasync();

    //查找与经典 linq join 语法相关的所有人员和书籍

    var result = await (from book in model.books

    join person in model.people on book equals person.borrowedbook

    select new { person }).tolistasync();

    //异步聚合和枚举( 所有由 name 分组的人员均为平均年龄)

    var values = await (from person in model.people

    group person by person.name

    select new { name = person.name, averageage = person.average(c =gt; age) }).getasyncenumerator();

    while (await values.movenextasync())

    {

    var value = values.current;

    console.writeline($"average age of person with name of {value.name} is {value.averageage}");

    }

    版权所有( c ) 2007 -2016皮带 nguyen ( tumtumtum@gmail.com )



    文章标签:suppospostpostgressqliteormlinq

    IT人知识库 原文地址:http://www.itpeo.net/389612/4625638.html





    rfedfre

    fks, 前端技能汇总 Frontend Knowledge Structure

    源代码名称:fks源代码网址:http://www.github.com/jacksontian/fksfks源代码文档 ...

    rfedfre

    NodeEditorWinforms, 基于 node的Windows 表单用户控件/编辑器

    源代码名称:nodeeditorwinforms源代码网址:http://www.github.com/komorra/ ...

    rfedfre

    wechat-explorer, 微信聊天记录导出、分析工具

    源代码名称:wechat-explorer源代码网址:http://www.github.com/humiaozuzu/ ...

    rfedfre

    renovate, 自动依赖更新灵活,因此你无需

    源代码名称:renovate源代码网址:http://www.github.com/renovateapp/renova ...

    dns-violations, 通过实现,软件和/或者系统列出DNS违规的列表

    源代码名称:dns-violations源代码网址:http://www.github.com/dns-violatio ...

    linksuteis, Alguns链接 úteis para Desenvolvedores站点

    源代码名称:linksuteis源代码网址:http://www.github.com/pamelama/linksut ...

    Grissom.CMS, 基于.NET平台的后台内容管理系统

    源代码名称:grissom.cms源代码网址:http://www.github.com/grissomlau/gris ...

    rfedfre

    mlcourse, 机器学习课程材料

    源代码名称:mlcourse源代码网址:http://www.github.com/davidrosenberg/mlc ...

    sway, i3兼容的Wayland合成器

    源代码名称:sway源代码网址:http://www.github.com/swaywm/swaysway源代码文档sw ...

    IWBootstrapFramework, Delphi的Intraweb Bootstrap 3框架

    源代码名称:iwbootstrapframework源代码网址:http://www.github.com/kattun ...

    swagger-ui, 汉化了swagger-ui,修改了部分样式

    源代码名称:swagger-ui源代码网址:http://www.github.com/helei112g/swagge ...

    rfedfre

    node-fv, 用于从扫描表单中提取数据的node.js 库

    源代码名称:node-fv源代码网址:http://www.github.com/creatale/node-fvnod ...

    TimLiu-Python, python资源集合与开源硬件

    源代码名称:timliu-python源代码网址:http://www.github.com/tim9liu9/timl ...

    v2ex-plus, 可能是 v2ex 最好用的扩展

    源代码名称:v2ex-plus源代码网址:http://www.github.com/sciooga/v2ex-plus ...

    minsky, 系统动力学经济学建模软件

    源代码名称:minsky源代码网址:http://www.github.com/highperformancecoder ...

    rfedfre

    github-graphql-rails-example, 使用 GitHub API GraphQL的示例 Rails 应用程序

    源代码名称:github-graphql-rails-example源代码网址:http://www.github.co ...

    segment, 用于绘制和动画SVG路径笔划的JavaScript库

    源代码名称:segment源代码网址:http://www.github.com/lmgonzalves/segment ...

    scala-whats-that-called, 那你叫什么来着 用于 Scala

    源代码名称:scala-whats-that-called源代码网址:http://www.github.com/and ...

    ansvif, 一个不那么智能的Fuzzer

    源代码名称:ansvif源代码网址:http://www.github.com/oxagast/ansvifansvif ...

    fileintel, 模块化 python 应用程序,用于获取恶意文件

    源代码名称:fileintel源代码网址:http://www.github.com/keithjjones/filei ...