FreeSql

FreeSql 是一个功能强大的 NETStandard 库,用于对象关系映射程序(O/RM),提供了 CodeFirst/DbFirst/CURD/表达式函数/读写分离 等基础封装。支持 .NETCore 2.1+ 或 .NETFramework 4.0+。

新的查询功能

且先看看实体定义:

public class Song {
[Column(IsIdentity = true)]
public int Id { get; set; }
public DateTime? Create_time { get; set; }
public bool? Is_deleted { get; set; }
public string Title { get; set; }
public string Url { get; set; } public virtual ICollection<Tag> Tags { get; set; }
}
public class Song_tag {
public int Song_id { get; set; }
public virtual Song Song { get; set; } public int Tag_id { get; set; }
public virtual Tag Tag { get; set; }
}
public class Tag {
[Column(IsIdentity = true)]
public int Id { get; set; }
public int? Parent_id { get; set; }
public virtual Tag Parent { get; set; } public decimal? Ddd { get; set; }
public string Name { get; set; } public virtual ICollection<Song> Songs { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}

以上定义了三个实体,Song、Tag,以及中间表SongTag。

一对一、多对一的查询:

var t0 = fsql.Select<Tag>().Where(a => a.Parent.Parent.Name == "粤语").ToSql();

执行转换的SQL语句:

SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
FROM `Tag` a
LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
WHERE (a__Parent__Parent.`Name` = '粤语')

一对多的查询:

var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();

执行转换的SQL语句:

SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
FROM `Tag` a
WHERE (exists(SELECT 1
FROM `Tag` t
LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
limit 0,1))

多对多的查询:

var t2 = fsql.Select<Song>().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();

执行转换的SQL语句:

SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
FROM `Song` a
WHERE(exists(SELECT 1
FROM `Song_tag` Mt_Ms
WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
FROM `Tag` t
WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
limit 0, 1))
limit 0, 1))

这个功能不受外建影响,更多前往wiki:《Select查询数据文档》

表达式函数

var t1 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToSql();
//SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, a.`Title`, a.`CreateTime`
//FROM `Song` a
//WHERE (a.`Id` in (1,2,3))

查找今天创建的数据

var t2 = select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToSql();

SqlServer 下随机获取记录

var t3 = select.OrderBy(a => Guid.NewGuid()).Limit(1).ToSql();
//SELECT top 1 ...
//FROM [Song] a
//ORDER BY newid()

更多前往wiki:《Expression 表达式函数文档》

完整特性

  • 支持 CodeFirst 迁移;
  • 支持 DbFirst 从数据库导入实体类,支持三种模板生成器;
  • 采用 ExpressionTree 高性能读取数据;
  • 支持深入的类型映射,比如pgsql的数组类型,堪称匠心制作;
  • 支持丰富的表达式函数;
  • 支持导航属性查询,和延时加载;
  • 支持同步/异步数据库操作方法,丰富多彩的链式查询方法;
  • 支持读写分离、分表分库,租户设计;
  • 支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite;
入门 《Select》 | 《Update》 | 《Insert》 | 《Delete》
新手 《表达式函数》 | 《CodeFirst》 | 《DbFirst》
高手 《Repository》 | 《UnitOfWork》 | 《过滤器》
不朽 《读写分离》 | 《分区分表》 | 《租户》 | 更新日志

快速开始

以 .net core 新项目为例,创建新项目

dotnet new webapi

引入 FreeSql 包

dotnet add package FreeSql.Repository

在 startup.cs 中定义 IFreeSql 和注入仓储

public Startup(IConfiguration configuration, ILoggerFactory loggerFactory) {
Configuration = configuration; Fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|/document.db;Pooling=true;Max Pool Size=10")
.UseAutoSyncStructure(true)
//自动同步实体结构到数据库
.UseLazyLoading(true)
//开启延时加载,导航属性 .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))
//跟踪SQL执行语句
.Build();
} public IConfiguration Configuration { get; }
public IFreeSql Fsql { get; } public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc(); services.AddSingleton<IFreeSql>(Fsql); var builder = new ContainerBuilder(); builder.RegisterFreeRepository(
filter => filter
.Apply<ISoftDelete>("softdelete", a => a.IsDeleted == false)
//开启软删除过滤器,可定义多个全局过滤器
,
this.GetType().Assembly
//将本项目中所有继承实现的仓储批量注入
); builder.Populate(services);
var container = builder.Build();
return new AutofacServiceProvider(container);
}

然后在 controller 中就可以像平常一样使用仓储了,如:

[Route("restapi/[controller]")]
public class SongsController : Controller { GuidRepository<Song> _songRepository; public SongsController(GuidRepository<Song> repos1) {
_songRepository = repos1;
}

FreeSql.Repository

FreeSql.Repository 参考 abp vnext 接口,定义和实现基础的仓储层(CURD)。除此以外,它还实用的全局、局部过滤器功能,分表分方库功能,以及工作单元的实现;

过滤器功能不仅可以查询时过滤,连删除/修改/插入时都会进行验证,避免开过过程担心数据安全问题;

UnitOfWork 可将多个仓储放在一个单元管理执行,最终通用 Commit 执行所有操作,内部采用了数据库事务;

结束语

本次更新主要涉及 一对一、多对一、一对多、多对多 的查询,当约定配置不正确的时候使用导航属性,会出现友好的错误提示。

感谢您的关注,github:https://github.com/2881099/FreeSql,求给出宝贵的一星,谢谢!

FreeSql 新查询功能介绍的更多相关文章

  1. FreeSql 新功能介绍:贪婪加载五种方法

    前言 FreeSql 在经过6个月的开发和朋友们的工作实践,不断的改进创新,目前拥有1500个左右单元测试方法,且每个方法内又复盖不同的测试面. 今天介绍 FreeSql 各种贪婪加载的姿势,作下总结 ...

  2. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  3. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  4. ORM 创新解放劳动力 -SqlSugar 新功能介绍

    介绍 SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新 ,Github star数仅次于EF 和 Dapper 优点: 简单易用.功能齐全.高性能.轻量级.服务齐 ...

  5. 【设计过程】.NET ORM FreeSql WhereDynamicFilter 动态表格查询功能

    前言 最近几乎每天40度,越热越不想面对电脑,还好开源项目都比较稳定没那么多待解决问题,趁着暑假带着女儿学习游泳已略有小成.游泳好处太多了,建议有孩子的都去学学,我是在岸边指导大约一周左右就学会了,目 ...

  6. 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段

    创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...

  7. MWeb 1.4 新功能介绍一:引入文件夹到 MWeb 中管理,支持 Octpress、Jekyll 等静态博客拖拽插入图片和实时预览

    之前在 MWeb 中打开非文档库中的 Markdown 文档,如果文档中有引用到本机图片,是没办法在 MWeb 中显示出来和预览的.这是因为 Apple 规定在 Mac App Store(MAS) ...

  8. 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍

    回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...

  9. fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址)

    fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址) 最新的Fedora 21终于正式发布了,Fedora Server 是一款强大可定制化的操作系统,包括了最好最 ...

随机推荐

  1. PHP采用Cookie实现 购物车

    先来看一下逻辑分析图:

  2. CSS 静态进度条效果

    今天学习到了实现一个静态进度条的方法,固写一篇笔记稳固一下自己的知识. 最终的效果如下,进度条放在一个框里,水平宽自适应. 现在就开始,首先写一个进度条先. .progress-bar{ /* 进度条 ...

  3. Java学习方向

    又过了一段日子了,项目比之前要熟悉很多了,有很多要学的东西要提上日程了. 个人感觉java基础很重要,只有基础扎实了,才能更好的写出代码和提升自己,需要好好的学习,以下是大概需要学习的方向 # jav ...

  4. mvc中路由的映射和实现IHttpHandler挂载

    首先我们了解一下一般的方法 我们只需要在web.config配置文件中做映射处理即可. 第一种形式: <system.web> <urlMappings enabled=" ...

  5. 更新版PowerBI发布了-- Power BI Report Server Update – March 2018

    新版的PowerBI server 和 Desktop 终于发布了.  详细增加功能见以下链接: 下载最新版PowerBI Report Server: https://powerbi.microso ...

  6. 网络营销行业十大看了就想吐的“滥词”

    网络营销行业在国内的互联网界已"猖獗"数年之久,它是一个让企业爱让用户恨的行业.有互联网的地方,就有网络营销的机会,有了机会就有了相关产业的存在,只不过是业大业小的问题.但是随着互 ...

  7. C++11 左值、右值、右值引用

    左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...

  8. expdb和impdb使用方法

    一  关于expdp和impdp     使用EXPDP和IMPDP时应该注意的事项:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具 ...

  9. spring中@Resource和@Autowired理解

    一.@Resource的理解 @Resource在bean注入的时候使用,@Resource所属包其实不是spring,而是javax.annotation.Resource,只不过spring支持该 ...

  10. 关于Linux虚拟化技术KVM的科普 科普一(先用起来!)

    是骡子是马是拉出来溜溜,通过<KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机>跑一遍,就会对KVM.QEMU-KVM有个大概的认识了. qemu-kvm已经不单独存在,qemu加上 ...