FreeSql 新查询功能介绍

32次阅读

共计 4222 个字符,预计需要花费 11 分钟才能阅读完成。

FreeSql
FreeSql 是一个功能强大的 NETStandard 库,用于对象关系映射程序 (O/RM),提供了 CodeFirst/DbFirst/CURD/ 表达式函数 / 读写分离 等基础封装。支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+。
新的查询功能
且先看看实体定义:
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 语句:
var t1 = fsql.Select<Tag>().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
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,求给出宝贵的一星,谢谢!

正文完
 0