zoukankan      html  css  js  c++  java
  • FluentData

    1.什么是FluentData

    FluentData 是微型 ORM(micro-ORM)家族的一名新成员,旨在比大型 ORM(full ORM)更加易用。它使用 fluent API 并支持 SQL Server、SQL Azure、Oracle 和 MYSQL。
     FluentData 的设计者 Lars-Erik Kindblad 谈到:

    当前市面上的 ORM 框架,如 Entity Framework 和 NHibernate,都过于复杂而且难于学习。此外,由于这些框架自身抽象的查询语言以及从数据库到 .NET 对象的映射太过麻烦,导致它们生成的 SQL 都很低效。

    FluentData 另辟蹊径,它是一个轻量级框架,拥有简单的 fluent API 并且很容易学会。

     与其他微型 ORM(如 Dapper 和 Massive)类似,FluentData 关注性能和易用性。它允许开发人员拥有对 SQL 较多的控制,而不是依赖 ORM 进行自动生成。它不仅可以使用 SQL 来执行查询、增添和更新操作,还可以支持使用存储过程和事务。根据文档描述,FluentData 可以在不改动已有结构的情况下,与任何业务对象一同工作。

      以下是 FluentData 的一些其他特性:

    多结果集(Multiple Result Set):在一次数据库操作下返回多个数据集;
    开发人员可使用强类型对象或动态对象;
    可为创建时需要特殊处理的复杂对象自定义实体工厂(Custom Entity Factory);
    具有添加其他数据库支持的能力。
      FluentData 需要 .NET 4.0,并支持 SQL Server、SQL Azure、SQL Server Compact 以及使用 .NET 驱动的 Oracle 和 MySQL

    2.FluentData 核心

    DbContext类

    这是FluentData的核心类,可以通过配置ConnectionString来定义这个类,如何连接数据库和对具体的哪个数据库进行数据查询操作。

    DbCommand类

    这个类负责在相对应的数据库执行具体的每一个数据操作。

    Events

    DbContext类定义了以下这些事件:

    OnConnectionClosed
    OnConnectionOpened
    OnConnectionOpening
    OnError
    OnExecuted
    OnExecuting
    可以在事件中,记录每个SQL查询错误或者SQL查询执行的 时间等信息。
    Builders
    Builder用来创建Insert, Update, Delete等相关的DbCommand实例。

    Mapping

    FluentData可以将SQL查询结果自动映射成一个POCO(POCO - Plain Old CLR Object)实体类,也可以转换成一个dynamic类型。

    自动转成实体类:

    如果字段名中不包含下划线("_"),将映射到具有相同名字的属性上,例如:字段名 "Name" 将映射到属性名 "Name"。
    如果字段名中包含下划线("_"),将映射到内嵌的属性上,例如:字段名 "Category_Name" 将映射到属性名 "Category.Name"。
    如果数据库字段名和属性名不一致,可以使用SQL的as让他们一致。

    自动转换成dynamic类型:

    对应dynamic类型,会为每个字段生成一个同名的属性,例如:字段名 "Name" 将映射到属性名 "Name"。

    什么时候应该主动释放资源?

    如果使用UseTransaction或者UseSharedConnection,那么DbContext需要主动释放。
    如果使用UseMultiResult或者MultiResultSql,那么DbCommand需要主动释放。
    如果使用UseMultiResult,那么StoredProcedureBuilder需要主动释放。
    其他所有的类都会自动释放,也就是说,一个数据库连接只在查询开始前才进行,查询结束后会马上关闭。

    3.FluentData 操作步骤

      第一步:引用FluentData.dll或者直接添加FluentData.cs

      第二步:Create and initialize a DbContext(创建并且初始化DBContext对象)

      第三步:使用接口做相关的增删改查操作

      

    4.FluentData Query

    4.1.查询返回一个列表

    #region 查询返回一个列表
            // 查询返回动态dynamic类型的泛型集合
            public static void QueryListDynamic()
            {
                List<dynamic> list = Context.Sql("select * from tb").QueryMany<dynamic>();
                list.ForEach(m => Console.WriteLine(String.Format("Id:{0},Name:{1}",m.Id,m.Name)));
            }
            //查询返回一个强类型的泛型集合
            public static void QueryListInstance()
            {
                List<Tb> list = Context.Sql("select * from tb").QueryMany<Tb>();
                list.ForEach(m => Console.WriteLine(String.Format("Tb==>Id:{0},Name:{1}", m.Id, m.Name)));
            }
            //查询返回一个DataTable类型的泛型集合
            public static void QuertListDataTable()
            {
                List<DataTable> dt = Context.Sql("select * from tb").QueryMany<DataTable>();
                dt.ForEach(
                   table =>
                   {
                       for (int i = 0; i < table.Rows.Count; i++)
                       {
                           Console.WriteLine(table.Rows[i]["Name"].ToString());
                       }
                   }
                    );
            }
            #endregion

    4.2 查询返回一个单一项(对象)

    #region 查询返回一个单一项(对象)
            public static void QueryDynamic()
            {
                dynamic list = Context.Sql("  select * from tb where Id =3").QuerySingle<dynamic>();
                Console.WriteLine(list.Name);
            }
            public static void QueryInstace()
            {
                Tb instance = Context.Sql(" select * from tb where Id =3").QuerySingle<Tb>();
                Console.WriteLine(instance.Name);
            }
            public static void QueryDataTable()
            {
                DataTable dt = Context.Sql("select * from tb where Id =3").QuerySingle<DataTable>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Console.WriteLine(dt.Rows[i]["Name"].ToString());
                }   
            }
            #endregion

    4.3 查询返回一个单一值

    #region 查询返回一个单一值
            public static void QuerySacleInt()
            {
                int i = Context.Sql("select count(*) from tb").QuerySingle<int>();
                Console.WriteLine(i);
            }
            #endregion

    4.4 查询返回一个单一值列表

       #region 查询返回一个单一值列表
            public static void QueryListString()
            {
                List<string> result = Context.Sql("  select Name from tb").QueryMany<string>();
                result.ForEach(m => Console.WriteLine(m));
            }

    4.5 参数化查询

    #region 参数化查询
            public static void QueryListParameters()
            {
                var result = Context.Sql("select * from tb where Id =@0 or Id=@1").Parameters(1, 2).QueryMany<dynamic>();
                result.ForEach(m => Console.WriteLine(m.Name));
            }
    
            public static void QueryListParameters2()
            {
                var result = Context.Sql("select * from tb where Id =@id1 or Id=@id2")
                    .Parameter("id1", 1).Parameter("id2", 2).QueryMany<dynamic>();
                result.ForEach(m => Console.WriteLine(m.Name));
            }
    
            public static void QueryOutParameters()
            {
                var command = Context.Sql("select @ProductName = Name from tb ")
                    .ParameterOut("ProductName", FluentData.DataTypes.String, 50);
                command.Execute();
                string tt = command.ParameterValue<string>("ProductName");
                //List<string> tt = command.ParameterValue<List<string>>("ProductName");
                Console.WriteLine(tt);
            }
    
            public static void QueryList()
            {
                List<int> ids = new List<int>() { 1, 2, 3, 4 };
                List<dynamic> result = Context.Sql(@"select * from tb
                where Id in(@0)", ids).QueryMany<dynamic>();
                result.ForEach(t => Console.WriteLine(t.Name));
            }
            #endregion
  • 相关阅读:
    apache启用gzip压缩方法--转载自http://www.cnblogs.com/linzhenjie/archive/2013/03/05/2943635.html
    yii 主从数据库分离-转载http://www.yiichina.com/doc/guide/2.0/db-dao
    服装尺寸
    php 同步因子的并发处理
    NFC会员管理-转载自http://technews.cn/2014/09/13/nfc-sticker/
    Redis 利用锁机制来防止缓存过期产生的惊群现象-转载自 http://my.oschina.net/u/1156660/blog/360552
    移动端H5页面的设计稿尺寸大小规范-转载自http://www.chinaz.com/design/2015/1103/465670.shtml
    服饰行业淘宝商城店铺首页设计报告-转载自http://bbs.paidai.com/topic/88363
    网页设计的标准尺寸
    hdu2099
  • 原文地址:https://www.cnblogs.com/youguess/p/12420662.html
Copyright © 2011-2022 走看看