HTML5技术

[开源].NET数据库访问框架Chloe.ORM - 我叫So(3)

字号+ 作者:H5之家 来源:博客园 2016-07-04 13:00 我要评论( )

IQueryUser q = context.QueryUser();IGroupingQueryUser g = q.Where(a = a.Id 0).GroupBy(a = a.Age);g = g.Having(a = a.Age 1 DbFunctions.Count() 0);g.Select(a = new { a.Age, Count = DbFunctions.Count(),

IQuery<User> q = context.Query<User>(); IGroupingQuery<User> g = q.Where(a => a.Id > 0).GroupBy(a => a.Age); g = g.Having(a => a.Age > 1 && DbFunctions.Count() > 0); g.Select(a => new { a.Age, Count = DbFunctions.Count(), Sum = DbFunctions.Sum(a.Age), Max = DbFunctions.Max(a.Age), Min = DbFunctions.Min(a.Age), Avg = DbFunctions.Average(a.Age) }).ToList(); /* * SELECT [Users].[Age] AS [Age],COUNT(1) AS [Count],SUM([Users].[Age]) AS [Sum],MAX([Users].[Age]) AS [Max],MIN([Users].[Age]) AS [Min],CAST(AVG([Users].[Age]) AS FLOAT) AS [Avg] FROM [Users] AS [Users] WHERE [Users].[Id] > 0 GROUP BY [Users].[Age] HAVING ([Users].[Age] > 1 AND COUNT(1) > 0) */

View Code

SqlQuery

上面是纯面向对象的方式查询。连接查询、聚合查询、分组查询如此轻松,有没有觉得很方便?当然,始终和 linq 那种接近 sql 的 from v in q where v > 3 select v 写法没法比!同时,ORM始终是个工具,它并不是万能的,对于一些复杂的语句,还是得需要手写,因此,DbContext 也提供原生 sql 查询接口

context.SqlQuery<User>("select Id,Name,Age from Users where Name=@name", DbParam.Create("@name", "lu")).ToList(); context.SqlQuery<int>("select Id from Users").ToList();

经测试,非 Debug 情况下,且都经过预热后,相同的查询在速度、性能上与 Dapper 相当,甚至比 Dapper 还快那么一丢丢。

使用进阶

IQuery<T> 接口支持连接查询、聚合查询、分组查询,这几个接口配合使用可以减少很多我们开发中的烦恼。比如:

去视图

做数据库开发,多表关联的数据结构肯定不少,难免会有多表连接查询,很多时候,为了方便查询,一般我们都会建立视图。在我看来视图很烦,真的烦。

int 烦 = 0;

1.建视图的时候,字段多的话,烦++,如果出现字段重名的情况,必须起别名,烦++。

2.视图建立起来了以后,查询是方便了,但后面维护就不那么友好了,比如某个表字段名改了、增加一个字段、删除一个字段等情况,得修改相应的视图(1个或多个),烦++;同时又要去修改相映射的实体,烦++。总之,Console.Write("烦烦烦: " + 烦.ToString()); 对于我这种懒程序员,这简直就是种煎熬!如果一套 ORM 支持连接查询,在一定程度上可以减少在数据库上建视图数量,无形中省出好多时间。

为了让 Chloe 支持连接查询,费了我不少劲。连接查询的好处可以看上面连接查询部分。

勉强应付一些复杂查询

比如,本文中的 User 表、City 表,他们的关系是一个 User 隶属一个 City,一个 City 有多个用户。假设,现在有需求要查出 City 的信息,同时也要把该 City 下用户最小的年龄输出,如果用原生 sql 写的话大概是:

Users.CityId) as T on City.Id=T.CityId

虽然也不是很复杂。来看看 Chloe 如何实现:

IQuery<User> users = context.Query<User>(); IQuery<City> cities = context.Query<City>(); var gq = users.GroupBy(a => a.CityId).Select(a => new { a.CityId, MinAge = DbFunctions.Min(a.Age) }); cities.LeftJoin(gq, (city, g) => city.Id == g.CityId).Select((city, g) => new { City = city, MinAge = g.MinAge }).ToList(); /* * SELECT [T].[MinAge] AS [MinAge],[City].[Id] AS [Id],[City].[Name] AS [Name],[City].[ProvinceId] AS [ProvinceId] FROM [City] AS [City] LEFT JOIN (SELECT [Users].[CityId] AS [CityId],MIN([Users].[Age]) AS [MinAge] FROM [Users] AS [Users] GROUP BY [Users].[CityId]) AS [T] ON [City].[Id] = [T].[CityId] */

View Code

完全可以用面向对象的方式就可以实现,怎么样?很实用吧,免去拼 sql,让更多的时间去做业务开发!

更多的用法还有待挖掘。

支持的lambda

Chloe 查询条件依赖 lambda 表达式,从对 lambda 表达式树零认知到完成对其解析这块,花了我好多精力,费了好多神,掉了不少头发。现在对谓语支持很丰富,可以说爱怎么写就怎么写~

IQuery<User> q = context.Query<User>(); List<int> ids = new List<int>(); ids.Add(1); ids.Add(2); ids.Add(2); string name = "lu"; string nullString = null; bool b = false; bool b1 = true; q.Where(a => true).ToList(); q.Where(a => a.Id == 1).ToList(); q.Where(a => a.Id == 1 || a.Id > 1).ToList(); q.Where(a => a.Id == 1 && a.Name == name && a.Name == nullString && a.Id == FeatureTest.ID).ToList(); q.Where(a => ids.Contains(a.Id)).ToList(); q.Where(a => !b == (a.Id > 0)).ToList(); q.Where(a => a.Id > 0).Where(a => a.Id == 1).ToList(); q.Where(a => !(a.Id > 10)).ToList(); q.Where(a => !(a.Name == name)).ToList(); q.Where(a => a.Name != name).ToList(); q.Where(a => a.Name == name).ToList(); q.Where(a => (a.Name == name) == (a.Id > 0)).ToList(); q.Where(a => a.Name == (a.Name ?? name)).ToList(); q.Where(a => (a.Age == null ? 0 : 1) == 1).ToList(); //运算操作符 q.Select(a => new { Add = 1 + 2, Subtract = 2 - 1, Multiply = 2 * 11, Divide = 4 / 2, And = true & false, IntAnd = 1 & 2, Or = true | false, IntOr = 3 | 1, }).ToList();

View Code

常用的函数

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Dora.Interception: 一个为.NET Core度身定制的AOP框架 - Artech

    Dora.Interception: 一个为.NET Core度身定制的AOP框架 - Artech

    2017-05-02 11:00

  • 如何在 ASP.NET Core 中发送邮件 - Savorboard

    如何在 ASP.NET Core 中发送邮件 - Savorboard

    2017-05-02 08:02

  • 十二个 ASP.NET Core 例子 - Savorboard

    十二个 ASP.NET Core 例子 - Savorboard

    2017-04-27 16:01

  • HTML5 进阶系列:indexedDB 数据库 - _林鑫

    HTML5 进阶系列:indexedDB 数据库 - _林鑫

    2017-04-27 14:02

网友点评
r