diff --git a/Docs/1 简介.md b/Docs/1. quickstart.md similarity index 100% rename from Docs/1 简介.md rename to Docs/1. quickstart.md diff --git a/Docs/select.md b/Docs/select.md index 5766cf05..ccf443c0 100644 --- a/Docs/select.md +++ b/Docs/select.md @@ -34,14 +34,6 @@ class TestTypeParentInfo { # Where -### 表达式函数支持 - -#### String 对象方法 -StartsWith, EndsWith, Contains, ToLower, ToUpper, Substring, Length, IndexOf, PadLeft, PadRight, Trim, TrimStart, TrimEnd, Replace, CompareTo - -#### Math 方法 -... - ### 单表 ```csharp var sql = select.Where(a => a.Id == 10).ToSql(); @@ -49,7 +41,11 @@ var sql = select.Where(a => a.Id == 10).ToSql(); sql = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100).ToSql(); ///SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE (a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100) + +sql = select.Where(a => new []{1,2,3}.Contains(a.Id)).ToSql(); +//SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE (a.`Id` in (1,2,3)) ``` +> [《Expression 表达式函数文档》](Docs/expression.md) ### 多表,使用导航属性 ```csharp @@ -77,6 +73,33 @@ sql = select.From((s, b, c) => s //SELECT a.`Id`, a.`Clicks`, a.`TestTypeInfoGuid`, b.`Guid`, b.`ParentId`, b.`Name`, a.`Title`, a.`CreateTime` FROM `tb_topic` a, `TestTypeParentInfo` c, `TestTypeInfo` b WHERE (a.`Id` = 10 AND c.`Name` = 'xxx') AND (b.`ParentId` = 20) ``` +### 子表 Exists 查询 +```csharp +var sql2222 = select.Where(a => select.Where(b => b.Id == a.Id).Any()).ToList(); +// SELECT a.`Id`, a.`TypeGuid`, a.`Title`, a.`CreateTime` +// FROM `xxx` a +// WHERE (exists(SELECT 1 +// FROM `xxx` b +// WHERE (b.`Id` = a.`Id`))) + +//两级相同的子表查询 +sql2222 = select.Where(a => + select.Where(b => b.Id == a.Id && select.Where(c => c.Id == b.Id).Where(d => d.Id == a.Id).Where(e => e.Id == b.Id) + .Offset(a.Id) + .Any() + ).Any() +).ToList(); +// SELECT a.`Id`, a.`TypeGuid`, a.`Title`, a.`CreateTime` +// FROM `xxx` a +// WHERE (exists(SELECT 1 +// FROM `xxx` b +// WHERE (b.`Id` = a.`Id` AND exists(SELECT 1 +// FROM `xxx` c +// WHERE (c.`Id` = b.`Id`) AND (c.`Id` = a.`Id`) AND (c.`Id` = b.`Id`) +// limit 0,1)) +// limit 0,1)) +``` + ### 原生SQL ```csharp sql = select.Where("a.clicks > 100 && a.id = ?id", new { id = 10 }).ToSql(); @@ -171,6 +194,22 @@ List<(int, string ,string)> t7 = fsql.Ado.Query<(int, string, string)>("select * List t8 = fsql.Ado.Query("select * from song"); ``` +### 分组聚合 +```csharp +var groupby = fsql.Select() + .GroupBy(a => new { tt2 = a.Title.Substring(0, 2), mod4 = a.Id % 4 }) + .Having(a => a.Count() > 0 && a.Avg(a.Key.mod4) > 0 && a.Max(a.Key.mod4) > 0) + .Having(a => a.Count() < 300 || a.Avg(a.Key.mod4) < 100) + .OrderBy(a => a.Key.tt2) + .OrderByDescending(a => a.Count()) + .ToList(a => new { a.Key.tt2, cou1 = a.Count(), arg1 = a.Avg(a.Key.mod4) }); +//SELECT substr(a.`Title`, 1, 2) as1, count(1) as2, avg((a.`Id` % 4)) as3 +//FROM `xxx` a +//GROUP BY substr(a.`Title`, 1, 2), (a.`Id` % 4) +//HAVING (count(1) > 0 AND avg((a.`Id` % 4)) > 0 AND max((a.`Id` % 4)) > 0) AND (count(1) < 300 OR avg((a.`Id` % 4)) < 100) +//ORDER BY substr(a.`Title`, 1, 2), count(1) DESC +``` + # 更多文档整理中。。。 | 方法 | 返回值 | 参数 | 描述 | @@ -199,7 +238,7 @@ List t8 = fsql.Ado.Query("select * from song"); | Where | \ | string, parms | 原生sql语法条件,Where("id = ?id", new { id = 1 }) | | WhereIf | \ | bool, string, parms | 原生sql语法条件,WhereIf(true, "id = ?id", new { id = 1 }) | | 【分组】 | -| GroupBy | \ | Lambda | 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) | GroupBy(a => new[]{"name","time"}) | +| GroupBy | \ | Lambda | 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) | | GroupBy | \ | string, parms | 按原生sql语法分组,GroupBy("concat(name, ?cc)", new { cc = 1 }) | | Having | \ | string, parms | 按原生sql语法聚合条件过滤,Having("count(name) = ?cc", new { cc = 1 }) | | 【排序】 | diff --git a/readme.md b/readme.md index c265f81f..c9e8c801 100644 --- a/readme.md +++ b/readme.md @@ -6,15 +6,12 @@ FreeSql 可用作对象关系映射程序 (O/RM),以便于开发人员能够 FreeSql 支持 MySql/SqlServer/PostgreSQL 数据库技术实现。 -FreeSql 打造 .NETCore 最方便的 ORM,dbfirst codefirst混合使用,codefirst模式下的开发阶段,建好实体不用执行任何操作,就能创建表和修改字段,dbfirst模式下提供api+模板,自定义生成代码,作者提供了3种模板。 +FreeSql 打造 .NETCore 最方便的 ORM,dbfirst codefirst混合使用,codefirst模式下的开发阶段,建好实体不用执行任何操作即能创建表和修改字段,dbfirst模式下提供api+模板自定义生成代码,作者提供了3种模板,您可以持续关注或者参与给出宝贵意见,QQ群:4336577。 -FreeSql 目前仍处在测试阶段,您可以持续关注或者参与给出宝贵意见,QQ群:4336577 -* [《CodeFirst 快速开发文档》](Docs/codefirst.md) +[《Select查询数据文档》](Docs/select.md) | [《Update更新数据文档》](Docs/update.md) | [《Insert插入数据文档》](Docs/insert.md) | [《delete删除数据文档》](Docs/insert.md) -* [《DbFirst 快速开发文档》](Docs/dbfirst.md) - -* [《Expression 表达式函数文档》](Docs/expression.md) +[《Expression 表达式函数文档》](Docs/expression.md) | [《CodeFirst 快速开发文档》](Docs/codefirst.md) | [《DbFirst 快速开发文档》](Docs/dbfirst.md) # 快速开始 ```csharp @@ -71,7 +68,7 @@ class TopicTypeClass { } ``` -# Part1: 查询 +# Part1 查询 ```csharp List t1 = fsql.Select().Where(a => a.Id > 0).ToList(); @@ -161,7 +158,7 @@ List t8 = fsql.Ado.Query("select * from song"); ``` > 更多资料:[《Select查询数据》](Docs/select.md) -# Part2: 添加 +# Part2 添加 ```csharp var items = new List(); for (var a = 0; a < 10; a++) @@ -194,7 +191,7 @@ var t6 = fsql.Insert().AppendData(items) | ExecuteInserted | List\ | 执行SQL语句,返回插入后的记录 | > 更多资料:[《Insert添加数据》](Docs/select.md) -# Part3: 修改 +# Part3 修改 ```csharp var t1 = fsql.Update(1).Set(a => a.CreateTime, DateTime.Now).ToSql(); //UPDATE `tb_topic` SET `CreateTime` = '2018-12-08 00:04:59' WHERE (`Id` = 1) @@ -271,10 +268,10 @@ var t10 = fsql.Update().SetRaw("Title = {0}", "新标题").Where("Id = {0 | ExecuteUpdated | List\ | | 执行SQL语句,返回更新后的记录 | > 更多资料:[《Update更新数据》](Docs/select.md) -# Part4: 删除 +# Part4 删除 详情查看:[《Delete 删除数据》](Docs/delete.md) -# Part5: 表达式函数 +# Part5 表达式函数 详情查看:[《Expression 表达式函数》](Docs/expression.md) ## 贡献者名单