[开源] .Net ORM FreeSql 1.8.0-preview 最新动态播报

FreeSql 是 .NET 开源生态下的 ORM 轮子,在一些人眼里属于重复造轮子:不看也罢。就像昨天有位朋友截图某培训直播发给我看,内容为:“FreeSQL(个人产品),自己玩可以,不要商用。ORM框架:1.安全、稳定(更新稳定、有BUG有人修复,有人升级)”。

这突出其来的“关爱”,让我的内心毫无波澜,确实是毫无波澜,比起当初 FreeSql 初出茅庐之时的讽刺友好得多。写在开头的这些内容并不祈求这部分人改变观念,该黑的请继续黑,黑总比没有关注好,是吧?我无所谓你,但是别人呢?麻烦你们不要无脑抨击,你们这种行为不知道挽杀了多少社区项目。

2018 年 12 月份开发 FreeSql 到现在,1859 颗星,412 Issues,18 PR,170K 包下载量。说明还是有开发者关注和喜爱,只要有人关注,就不会停更不修 BUG 一说。大家有兴趣可以看看更新记录,看看我们的代码提交量,4700+ 单元测试不说非常多,我个人觉得已经超过很多国产项目,有兴趣的再去隔壁“国产第一” ORM 上看看,对比对比!如果不更新了,请把位置让出来;如果有BUG修复不了,请让 FreeSql 来;如果不好用,就不要搞一堆 SEO 害人入坑;如果。。。如果。。。

这不是挑衅,看到对方的 issues 实在不忍,看到对方的源码,哇哦,单元测试在哪里?好了不废话了。。

20个月了,FreeSql 还活着,而且生命力顽强见下图:

预告:年底发布 2.0.0 版本将冻结新功能开发,不再制造新 BUG,一心修复老功能引出的 BUG,完善文档。

本文将介绍在过去的三个月完成的一些有意义的功能介绍。

2|0入戏准备

FreeSql 是 .Net ORM,能支持 .NetFramework4.0+、.NetCore、Xamarin、XAUI、Blazor、以及还有说不出来的运行平台,因为代码绿色无依赖,支持新平台非常简单。目前单元测试数量:4700+,Nuget下载数量:170K+,源码几乎每天都有提交。值得高兴的是 FreeSql 加入了 ncc 开源社区:https://github.com/dotnetcore/FreeSql,加入组织之后社区责任感更大,需要更努力做好品质,为开源社区出一份力。

QQ群:4336577(已满)、8578575(在线)

为什么要重复造轮子?

FreeSql 主要优势在于易用性上,基本是开箱即用,在不同数据库之间切换兼容性比较好。作者花了大量的时间精力在这个项目,肯请您花半小时了解下项目,谢谢。

FreeSql 整体的功能特性如下:

  • 支持 CodeFirst 对比结构变化迁移;

  • 支持 DbFirst 从数据库导入实体类;

  • 支持 丰富的表达式函数,自定义解析;

  • 支持 批量添加、批量更新、BulkCopy;

  • 支持 导航属性,贪婪加载、延时加载、级联保存;

  • 支持 读写分离、分表分库,租户设计;

  • 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦/神通/人大金仓/MsAccess;

1.5.0 -> 1.8.0-preview 更新的重要功能如下:

一、增加 $"{a.Code}_{a.Id}" lambda 解析;

二、增加 lambda 表达式树解析子查询 ToList + string.Join() 产生 类似 group_concat 的效果;

三、增加 SqlExt 常用开窗函数的自定义表达式解析;

四、完善 WhereDynamicFilter 动态过滤查询;

五、增加 BeginEdit/EndEdit 批量编辑数据的功能;

六、增加 人大金仓/神通 数据库的访问支持;

七、增加 父子表(树表)递归查询、删除功能;

FreeSql 使用非常简单,只需要定义一个 IFreeSql 对象即可:

static IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, connectionString).UseAutoSyncStructure(true) //自动同步实体结构到数据库.Build(); //请务必定义成 Singleton 单例模式

3|0增加 $"{a.Code}_{a.Id}" lambda 解析;

在之前查询数据的时候,$"" 这种语法糖神器居然不能使用在 lambda 表达式中,实属遗憾。现在终于可以了,如下:

var item = fsql.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") });
var sql = fsql.Select<Topic>().WhereDynamic(item).ToSql(a => new
{str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}{a.Title}"
});
Assert.Equal($@"SELECT concat('x',ifnull((a.`Id` + 1), ''),'z-',ifnull(date_format(a.`CreateTime`,'%Y%m'), ''),'',ifnull(a.`Title`, ''),'',ifnull(a.`Title`, ''),'') as1
FROM `tb_topic` a
WHERE (a.`Id` = {item.Id})", sql);

再次说明:都是亲儿子,并且都有对应的单元测试,兄台大可放心用在不同的数据库中

4|0增加 lambda 表达式树解析子查询 ToList + string.Join() 产生 类似 group_concat 的效果;

v1.8.0+ string.Join + ToList 实现将子查询的多行结果,拼接为一个字符串,如:"1,2,3,4"

fsql.Select<Topic>().ToList(a => new {id = a.Id,concat = string.Join(",", fsql.Select<StringJoin01>().ToList(b => b.Id))
});
//SELECT a.`Id`, (SELECT group_concat(b.`Id` separator ',')
//    FROM `StringJoin01` b)
//FROM `Topic` a

该语法,在不同数据库都作了相应的 SQL 翻译。

5|0增加 SqlExt 常用的自定义表达式树解析;

SqlExt.cs 定义了一些常用的表达式树解析,如下:

fsql.Select<T1, T2>().InnerJoin((a, b) => b.Id == a.Id).ToList((a, b) => new{Id = a.Id,EdiId = b.Id,over1 = SqlExt.Rank().Over().OrderBy(a.Id).OrderByDescending(b.EdiId).ToValue(),case1 = SqlExt.Case().When(a.Id == 1, 10).When(a.Id == 2, 11).When(a.Id == 3, 12).When(a.Id == 4, 13).When(a.Id == 5, SqlExt.Case().When(b.Id == 1, 10000).Else(999).End()).End(), //这里因为复杂才这样,一般使用三元表达式即可:a.Id == 1 ? 10 : 11groupct1 = SqlExt.GroupConcat(a.Id).Distinct().OrderBy(b.EdiId).Separator("_").ToValue()});

本功能利用 FreeSql 自定义解析实现常用表达式树解析,欢迎 PR 补充

6|0完善 WhereDynamicFilter 动态过滤查询

是否见过这样的高级查询功能,WhereDynamicFilter 在后端可以轻松完成这件事情,前端根据 UI 组装好对应的 json 字符串传给后端就行,如下:

DynamicFilterInfo dyfilter = JsonConvert.DeserializeObject<DynamicFilterInfo>(@"
{""Logic"" : ""Or"",""Filters"" :[{""Field"" : ""Code"",""Operator"" : ""NotContains"",""Value"" : ""val1"",""Filters"" :[{""Field"" : ""Name"",""Operator"" : ""NotStartsWith"",""Value"" : ""val2"",}]},{""Field"" : ""Parent.Code"",""Operator"" : ""Equals"",""Value"" : ""val11"",""Filters"" :[{""Field"" : ""Parent.Name"",""Operator"" : ""Contains"",""Value"" : ""val22"",}]}]
}
");
fsql.Select<VM_District_Parent>().WhereDynamicFilter(dyfilter).ToList();
//SELECT a.""Code"", a.""Name"", a.""ParentCode"", a__Parent.""Code"" as4, a__Parent.""Name"" as5, a__Parent.""ParentCode"" as6
//FROM ""D_District"" a
//LEFT JOIN ""D_District"" a__Parent ON a__Parent.""Code"" = a.""ParentCode""
//WHERE (not((a.""Code"") LIKE '%val1%') AND not((a.""Name"") LIKE 'val2%') OR a__Parent.""Code"" = 'val11' AND (a__Parent.""Name"") LIKE '%val22%')

ISelect.WhereDynamicFilter 方法实现动态过滤条件(与前端交互),支持的操作符:

  • Contains/StartsWith/EndsWith/NotContains/NotStartsWith/NotEndsWith:包含/不包含,like '%xx%',或者 like 'xx%',或者 like '%xx'

  • Equal/NotEqual:等于/不等于

  • GreaterThan/GreaterThanOrEqual:大于/大于等于

  • LessThan/LessThanOrEqual:小于/小于等于

  • Range:范围查询

  • DateRange:日期范围,有特殊处理 value[1] + 1

  • Any/NotAny:是否符合 value 中任何一项(直白的说是 SQL IN)

7|0增加 BeginEdit/EndEdit 批量编辑数据的功能;

场景:winform 加载表数据后,一顿添加、修改、删除操作之后,点击【保存】

[Fact]
public void BeginEdit()
{fsql.Delete<BeginEdit01>().Where("1=1").ExecuteAffrows();var repo = fsql.GetRepository<BeginEdit01>();var cts = new[] {new BeginEdit01 { Name = "分类1" },new BeginEdit01 { Name = "分类1_1" },new BeginEdit01 { Name = "分类1_2" },new BeginEdit01 { Name = "分类1_3" },new BeginEdit01 { Name = "分类2" },new BeginEdit01 { Name = "分类2_1" },new BeginEdit01 { Name = "分类2_2" }}.ToList();repo.Insert(cts);repo.BeginEdit(cts); //开始对 cts 进行编辑cts.Add(new BeginEdit01 { Name = "分类2_3" });cts[0].Name = "123123";cts.RemoveAt(1);Assert.Equal(3, repo.EndEdit());
}
class BeginEdit01
{public Guid Id { get; set; }public string Name { get; set; }
}

上面的代码 EndEdit 方法执行的时候产生 3 条 SQL 如下:

INSERT INTO "BeginEdit01"("Id", "Name") VALUES('5f26bf07-6ac3-cbe8-00da-7dd74818c3a6', '分类2_3')UPDATE "BeginEdit01" SET "Name" = '123123' 
WHERE ("Id" = '5f26bf00-6ac3-cbe8-00da-7dd01be76e26')DELETE FROM "BeginEdit01" WHERE ("Id" = '5f26bf00-6ac3-cbe8-00da-7dd11bcf54dc')

提醒:该操作只对变量 cts 有效,不是针对全表对比更新。

8|0增加 人大金仓/神通 数据库的访问支持

天津神舟通用数据技术有限公司(简称“神舟通用公司”),隶属于中国航天科技集团(CASC)。是国内从事数据库、大数据解决方案和数据挖掘分析产品研发的专业公司。公司获得了国家核高基科技重大专项重点支持,是核高基专项的牵头承担单位。自1993年在航天科技集团开展数据库研发以来,神通数据库已历经27年的发展历程。公司核心产品主要包括神通关系型数据库、神通KStore海量数据管理系统、神通商业智能套件等系列产品研发和市场销售。基于产品组合,可形成支持交易处理、MPP数据库集群、数据分析与处理等解决方案,可满足多种应用场景需求。产品通过了国家保密局涉密信息系统、公安部等保四级、军B +级等安全评测和认证。

北京人大金仓信息技术股份有限公司(以下简称“人大金仓”)是具有自主知识产权的国产数据管理软件与服务提供商。人大金仓由中国人民大学一批最早在国内开展数据库教学、科研、开发的专家于1999年发起创立,先后承担了国家“863”、“核高基”等重大专项,研发出了具有国际先进水平的大型通用数据库产品。2018年,人大金仓申报的“数据库管理系统核心技术的创新与金仓数据库产业化”项目荣获2018年度国家科学技术进步二等奖,产学研的融合进一步助力国家信息化建设。

随着华为、中兴事务,国产数据库市场相信是未来是趋势走向,纵观 .net core 整个圈子对国产神舟通用、人大金仓数据库的支持几乎为 0,今天 FreeSql ORM 可以使用 CodeFirst/DbFirst 两种模式进行开发。

并且声称:FreeSql 对各数据库没有亲儿子一说,除了 MsAcces 其他全部是亲儿子,在功能提供方面一碗水端平。

众所周知 EFCore for oracle 问题多,并且现在才刚刚更新到 3.x,在这样的背景下,一个国产数据库更不能指望谁实现好用的 EFCore。目前看来除了 EFCore for sqlserver 我们没把握完全占优势,起码在其他数据库肯定是我们更接地气。

使用 FreeSql 访问人大金仓/神通 数据库,只需要修改代码如下即可:

static IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.ShenTong, connectionString) //修改 DataType 设置切换数据库.UseAutoSyncStructure(true) //自动同步实体结构到数据库.Build(); //请务必定义成 Singleton 单例模式

9|0增加 父子表(树表)递归查询、删除功能;

无限级分类(父子)是一种比较常用的表设计,每种设计方式突出优势的同时也带来缺陷,如:

  • 方法1:表设计中只有 parent_id 字段,困扰:查询麻烦(本文可解决);

  • 方法2:表设计中冗余子级id便于查询,困扰:添加/更新/删除的时候需要重新计算;

  • 方法3:表设计中存储左右值编码,困扰:同上;

方法1设计最简单,我们正是解决它设计简单,使用复杂的问题。

首先,按照导航属性的定义,定义好父子属性:

public class Area
{[Column(IsPrimary = true)]public string Code { get; set; }public string Name { get; set; }public virtual string ParentCode { get; set; }[Navigate(nameof(ParentCode))]public Area Parent { get; set; }[Navigate(nameof(ParentCode))]public List<Area> Childs { get; set; }
}

定义 Parent 属性,在表达式中可以这样:

fsql.Select<Area>().Where(a => a.Parent.Parent.Parent.Name == "中国").First();

定义 Childs 属性,在表达式中可以这样(子查询):

fsql.Select<Area>().Where(a => a.Childs.AsSelect().Any(c => c.Name == "北京")).First();

定义 Childs 属性,还可以使用【级联保存】、【贪婪加载】 等等操作。

利用级联保存,添加测试数据如下:

fsql.Delete<Area>().Where("1=1").ExecuteAffrows();
var repo = fsql.GetRepository<Area>();
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
repo.DbContextOptions.NoneParameter = true;
repo.Insert(new Area
{Code = "100000",Name = "中国",Childs = new List<Area>(new[] {new Area{Code = "110000",Name = "北京",Childs = new List<Area>(new[] {new Area{ Code="110100", Name = "北京市" },new Area{ Code="110101", Name = "东城区" },})}})
});

功能1:ToTreeList

配置好父子属性之后,就可以这样用了:

var t1 = fsql.Select<Area>().ToTreeList();
Assert.Single(t1);
Assert.Equal("100000", t1[0].Code);
Assert.Single(t1[0].Childs);
Assert.Equal("110000", t1[0].Childs[0].Code);
Assert.Equal(2, t1[0].Childs[0].Childs.Count);
Assert.Equal("110100", t1[0].Childs[0].Childs[0].Code);
Assert.Equal("110101", t1[0].Childs[0].Childs[1].Code);

查询数据本来是平面的,ToTreeList 方法将返回的平面数据在内存中加工为树型 List 返回。

功能2:AsTreeCte 递归删除

很常见的无限级分类表功能,删除树节点时,把子节点也处理一下。

fsql.Select<Area>().Where(a => a.Name == "中国").AsTreeCte().ToDelete().ExecuteAffrows(); //删除 中国 下的所有记录

如果软删除:

fsql.Select<Area>().Where(a => a.Name == "中国").AsTreeCte().ToUpdate().Set(a => a.IsDeleted, true).ExecuteAffrows(); //软删除 中国 下的所有记录

功能3:AsTreeCte 递归查询

若不做数据冗余的无限级分类表设计,递归查询少不了,AsTreeCte 正是解决递归查询的封装,方法参数说明:

参数描述
(可选) pathSelector路径内容选择,可以设置查询返回:中国 -> 北京 -> 东城区
(可选) upfalse(默认):由父级向子级的递归查询,true:由子级向父级的递归查询
(可选) pathSeparator设置 pathSelector 的连接符,默认:->
(可选) level设置递归层级

通过测试的数据库:MySql8.0、SqlServer、PostgreSQL、Oracle、Sqlite、达梦、人大金仓

姿势一:AsTreeCte() + ToTreeList

var t2 = fsql.Select<Area>().Where(a => a.Name == "中国").AsTreeCte() //查询 中国 下的所有记录.OrderBy(a => a.Code).ToTreeList(); //非必须,也可以使用 ToList(见姿势二)
Assert.Single(t2);
Assert.Equal("100000", t2[0].Code);
Assert.Single(t2[0].Childs);
Assert.Equal("110000", t2[0].Childs[0].Code);
Assert.Equal(2, t2[0].Childs[0].Childs.Count);
Assert.Equal("110100", t2[0].Childs[0].Childs[0].Code);
Assert.Equal("110101", t2[0].Childs[0].Childs[1].Code);
// WITH "as_tree_cte"
// as
// (
// SELECT 0 as cte_level, a."Code", a."Name", a."ParentCode"
// FROM "Area" a
// WHERE (a."Name" = '中国')// union all// SELECT wct1.cte_level + 1 as cte_level, wct2."Code", wct2."Name", wct2."ParentCode"
// FROM "as_tree_cte" wct1
// INNER JOIN "Area" wct2 ON wct2."ParentCode" = wct1."Code"
// )
// SELECT a."Code", a."Name", a."ParentCode"
// FROM "as_tree_cte" a
// ORDER BY a."Code"

姿势二:AsTreeCte() + ToList

var t3 = fsql.Select<Area>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
Assert.Equal(4, t3.Count);
Assert.Equal("100000", t3[0].Code);
Assert.Equal("110000", t3[1].Code);
Assert.Equal("110100", t3[2].Code);
Assert.Equal("110101", t3[3].Code);
//执行的 SQL 与姿势一相同

姿势三:AsTreeCte(pathSelector) + ToList

设置 pathSelector 参数后,如何返回隐藏字段?

var t4 = fsql.Select<Area>().Where(a => a.Name == "中国").AsTreeCte(a => a.Name + "[" + a.Code + "]").OrderBy(a => a.Code).ToList(a => new {item = a,level = Convert.ToInt32("a.cte_level"),path = "a.cte_path" });
Assert.Equal(4, t4.Count);
Assert.Equal("100000", t4[0].item.Code);
Assert.Equal("110000", t4[1].item.Code);
Assert.Equal("110100", t4[2].item.Code);
Assert.Equal("110101", t4[3].item.Code);
Assert.Equal("中国[100000]", t4[0].path);
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
// WITH "as_tree_cte"
// as
// (
// SELECT 0 as cte_level, a."Name" || '[' || a."Code" || ']' as cte_path, a."Code", a."Name", a."ParentCode"
// FROM "Area" a
// WHERE (a."Name" = '中国')// union all// SELECT wct1.cte_level + 1 as cte_level, wct1.cte_path || ' -> ' || wct2."Name" || '[' || wct2."Code" || ']' as cte_path, wct2."Code", wct2."Name", wct2."ParentCode"
// FROM "as_tree_cte" wct1
// INNER JOIN "Area" wct2 ON wct2."ParentCode" = wct1."Code"
// )
// SELECT a."Code" as1, a."Name" as2, a."ParentCode" as5, a.cte_level as6, a.cte_path as7
// FROM "as_tree_cte" a
// ORDER BY a."Code"

更多姿势...请根据代码注释进行尝试

10|0写在最后

作者的努力,喜欢能打动到你,希望正在使用的、善良的您能动一动小手指,把文章转发一下,让更多人知道 .NET 有这样一个好用的 ORM 存在。谢谢了!!

FreeSql 开源协议 MIT https://github.com/dotnetcore/FreeSql,可以商用,文档齐全。QQ群:4336577(已满)、8578575(在线)

如果你有好的 ORM 实现想法,欢迎给作者留言讨论,谢谢观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

懂程序员的产品经理是什么样子?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「155」篇原创敬上大家好&#xff0c;我是Z哥。在互联网行业&#xff0c;产品经理和程序员之间的关系很微妙。表面看上去水火不容&#xff0c;在一方的眼里看另外一…

初识ABP vNext(2):ABP启动模板

点击上方蓝字"小黑在哪里"关注我吧AbpHelper模块安装前言上一篇介绍了ABP的一些基础知识&#xff0c;本篇继续介绍ABP的启动模板。使用ABP CLI命令就可以得到这个启动模板&#xff0c;其中包含了一些基础功能模块&#xff0c;你可以基于这个模板来快速开发。开始首先…

关于Dapper实现读写分离的个人思考

概念相关为了确保多线上环境数据库的稳定性和可用性&#xff0c;大部分情况下都使用了双机热备的技术。一般是一个主库一个从库或者多个从库的结构&#xff0c;从库的数据来自于主库的同步。在此基础上我们可以通过数据库反向代理工具或者使用程序的方式实现读写分离&#xff0…

135. 分发糖果002(贪心算法+思路+详解)

一&#xff1a;题目 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 评分更高的孩…

Enumerable 下又有新的扩展方法啦,快来一睹为快吧

一&#xff1a;背景1. 讲故事前段时间将公司的一个项目从 4.5 升级到了 framework 4.8 &#xff0c;编码的时候发现 Enumerable 中多了三个扩展方法&#xff1a; Append, Prepend, ToHashSet&#xff0c;想必玩过jquery的朋友一眼就能看出这三个方法的用途&#xff0c;这篇就和…

Jdbc创建表 利用循环添加数据 ,更新数据

一&#xff1a;上码 1.有的已经实现的就注释了 2.配置文件信息 package com.wyjedu.jdbc.PreparedStatement;import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;…

荣耀智慧屏功能曝光 首发华为鸿蒙OS,荣耀智慧屏功能曝光:首发华为鸿蒙OS,全场景智慧体验...

IT之家8月9日消息 今日&#xff0c;华为开发者大会于东莞松山湖正式拉开帷幕。今天下午的焦点毫无疑问是鸿蒙OS与EMUI10。明日下午14:00&#xff0c;华为的另一个重磅产品荣耀智慧屏也将正式发布。7月中旬&#xff0c;荣耀总裁赵明正式宣布了荣耀智慧屏&#xff0c;这也意味着华…

旧 WCF 项目迁移到 asp.net core + gRPC 的尝试

一个月前&#xff0c;公司的运行WCF的windows服务器down掉了&#xff0c;由于 AWS 没有通知&#xff0c;没有能第一时间发现问题。所以&#xff0c;客户提出将WCF服务由C#改为JAVA&#xff0c;在Linux上面运行&#xff1b;一方面&#xff0c;AWS对Linux有较多的监控措施&#x…

黑鲨会升级鸿蒙吗,买华为别乱选!这3款才是“最佳选择”,未来能升级鸿蒙系统...

原标题&#xff1a;买华为别乱选&#xff01;这3款才是“最佳选择”&#xff0c;未来能升级鸿蒙系统众所周知&#xff0c;当下国产手机品牌的进步很快&#xff0c;越来越多品牌的崛起让消费者们十分的纠结。而在国产品牌当中&#xff0c;华为一直都处于“领头羊”大家都知道现在…

.NET Core 部署IIS无法启动Hangfire方案

【导读】不知道是否有童鞋遇到过将.NET Core部署到IIS上时&#xff0c;但Hangfire无法启动&#xff0c;自然而然也就导致作业无法良好运行的问题&#xff0c;本文给出两个方案&#xff0c;不知是否有完美解决方案&#xff0c;若有&#xff0c;请于留言中给出&#xff0c;谢谢。…

初识ABP vNext(3):vue对接ABP基本思路

点击上方蓝字"小黑在哪里"关注我吧登录权限本地化创建项目ABPvue-element-admin前言上一篇介绍了ABP的启动模板以及AbpHelper工具的基本使用&#xff0c;这一篇将进入项目实战部分。因为目前ABP的官方模板只支持MVC和Angular&#xff0c;MVC的话咱.NET开发人员来写还…

leedcode04:转换字符串的最少操作次数

一&#xff1a;题目 给你一个字符串 s &#xff0c;由 n 个字符组成&#xff0c;每个字符不是 ‘X’ 就是 ‘O’ 。 一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 ‘O’ 。注意&#xff0c;如果字符已经是 ‘O’ &#xff0c;只需要保持 不变 。 返…

android 手机无线投屏,安卓手机无线投屏问与答

一、Android手机使用Miracast为什么经常投不上&#xff1f;A、Android手机机型较多&#xff0c;各个厂家实现Miracast有差异&#xff0c;导致有时候连接不稳定或者无法连接B、Miracast底层使用的WiFi-P2P功能&#xff0c;各家WiFi模组厂家支持情况有好坏&#xff0c;导致有时候…

.NET Core + Ocelot:API 网关

关于 API 网关的作用&#xff0c;核心是 API 请求的收口及控制&#xff0c;如&#xff1a;鉴权、限流、熔断、数据缓存 等都是开发中常见的需求&#xff0c;将此类需求交给网关层处理&#xff0c;可以使每个微服务更聚焦于业务功能开发&#xff0c;同时也可为下游服务的安全及稳…

leedcode05 找出缺失的观测数据(思路加详解)

一&#xff1a;题目 现有一份 n m 次投掷单个 六面 骰子的观测数据&#xff0c;骰子的每个面从 1 到 6 编号。观测数据中缺失了 n 份&#xff0c;你手上只拿到剩余 m 次投掷的数据。幸好你有之前计算过的这 n m 次投掷数据的 平均值 。 给你一个长度为 m 的整数数组 rolls …

关于导入c3p0-0.9.5.5.jar包引发NoClassDefFoundError、ClassNotFoundException

一&#xff1a;问题描述 明明已经导入包了&#xff0c;而且还可以进入导入jar包的类中&#xff0c;可就是一运行就报错 NoClassDefFoundErrorClassNotFoundException 二&#xff1a;问题解决 再多导入一个jar包即可 这两个包必须全部导入才可&#xff0c;查了半天。

IT技术人,“三十而已”

最近电视剧《三十而已》热播&#xff0c;我家的电视机自然也是被霸屏&#xff0c;我还是跟着妹纸看了看&#xff0c;开头和结局完整看完&#xff0c;中间看了一点&#xff0c;大部分都是在微信公众号上通过别人的文章看完的。我个人也已经30了&#xff0c;今天也和你聊聊30这个…

html5访问本地资源,HTML5实现一个访问本地文件的实例今

怎么通过 html5 读取本地文件看你要读取什么 在高深一点的要phphtml5 打开本地文件夹我想在chrome浏览器下实现点击 打开文件夹html5本地存储怎么做&#xff0c;html5本地存储实例详解html5本地存储实例详解之创建 1 首先我们新建一个html5的空白文档&#xff0c;小编这里演示用…

[PBI催化剂]国际水准,中国首款重量级PowerBIDeskTop外部工具问世

今天看到PowerBI社区里有人推荐了SQLBI开发的Excel连接PowerBIDeskTop的外部工具功能。经了解后&#xff0c;发现其功能还是存在较大的缺陷&#xff0c;更增加了对【PBI催化剂】的优秀程度的信心。在Excel的应用领域&#xff0c;催化剂有绝对的信心是领先国际水准的。Excel连接…

查询在具有最小内存容量的所有PC中具有最快处理器的PC制造商 (20 分)(两种思路+详解)

一&#xff1a;题目&#xff1a; 本题目要求编写SQL语句&#xff0c; 查询在具有最小内存容量的所有PC中具有最快处理器的PC制造商。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product ( maker CHAR(20) , --制造商model CHAR(20) NOT NULL, …