- 增加 子查询函数 First、Count、Min、Max、Sum、Avg 的支持;

This commit is contained in:
28810 2019-07-09 16:46:11 +08:00
parent 272e55ecbf
commit 87c9ccf5c3
18 changed files with 558 additions and 205 deletions

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql 扩展包,可实现【延时加载】属性.</Description>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<Authors>YeXiangQin</Authors>
<Description>FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table.</Description>
<PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/Repository</PackageProjectUrl>

View File

@ -336,6 +336,17 @@ namespace FreeSql.Tests.MySqlConnector
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
var subquery = select.ToSql(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
}
[Fact]
public void Master()
@ -870,18 +881,58 @@ namespace FreeSql.Tests.MySqlConnector
[Fact]
public void Sum()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
}
[Fact]
public void Min()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Min(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Min(b => b.Id)
});
}
[Fact]
public void Max()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Max(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Max(b => b.Id)
});
}
[Fact]
public void Avg()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
}
[Fact]
public void As()

View File

@ -326,6 +326,17 @@ namespace FreeSql.Tests.MySql
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
var subquery = select.ToSql(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
}
[Fact]
public void Master()
@ -860,18 +871,58 @@ namespace FreeSql.Tests.MySql
[Fact]
public void Sum()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
}
[Fact]
public void Min()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Min(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Min(b => b.Id)
});
}
[Fact]
public void Max()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Max(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Max(b => b.Id)
});
}
[Fact]
public void Avg()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
}
[Fact]
public void As()

View File

@ -212,6 +212,17 @@ namespace FreeSql.Tests.Oracle
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
var subquery = select.ToSql(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
}
[Fact]
public void Master()
@ -744,18 +755,58 @@ namespace FreeSql.Tests.Oracle
[Fact]
public void Sum()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
}
[Fact]
public void Min()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Min(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Min(b => b.Id)
});
}
[Fact]
public void Max()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Max(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Max(b => b.Id)
});
}
[Fact]
public void Avg()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
}
[Fact]
public void As()

View File

@ -289,6 +289,17 @@ namespace FreeSql.Tests.PostgreSQL
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
var subquery = select.ToSql(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
}
[Fact]
public void Master()
@ -818,18 +829,58 @@ namespace FreeSql.Tests.PostgreSQL
[Fact]
public void Sum()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
}
[Fact]
public void Min()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Min(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Min(b => b.Id)
});
}
[Fact]
public void Max()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Max(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Max(b => b.Id)
});
}
[Fact]
public void Avg()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
}
[Fact]
public void As()

View File

@ -213,6 +213,17 @@ namespace FreeSql.Tests.SqlServer
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
var subquery = select.ToSql(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
}
[Fact]
public void Master()
@ -741,18 +752,58 @@ namespace FreeSql.Tests.SqlServer
[Fact]
public void Sum()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
}
[Fact]
public void Min()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Min(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Min(b => b.Id)
});
}
[Fact]
public void Max()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Max(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Max(b => b.Id)
});
}
[Fact]
public void Avg()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
}
[Fact]
public void As()

View File

@ -224,6 +224,17 @@ namespace FreeSql.Tests.Sqlite
select.Where(a => 1 == 1).Count(out var count2);
Assert.Equal(count, count2);
Assert.Equal(0, select.Where(a => 1 == 2).Count());
var subquery = select.ToSql(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
});
}
[Fact]
public void Master()
@ -691,18 +702,58 @@ namespace FreeSql.Tests.Sqlite
[Fact]
public void Sum()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Sum(b => b.Id)
});
}
[Fact]
public void Min()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Min(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Min(b => b.Id)
});
}
[Fact]
public void Max()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Max(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Max(b => b.Id)
});
}
[Fact]
public void Avg()
{
var subquery = select.ToSql(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
var subqueryList = select.ToList(a => new
{
all = a,
count = select.Avg(b => b.Id)
});
}
[Fact]
public void As()

View File

@ -296,9 +296,24 @@ namespace FreeSql.Tests
[Fact]
public void Test1()
{
var teklksjdg = g.sqlite.Select<ZX.Model.CustomerCheckupGroup>()
.Where(a => true && a.CustomerMember.Group == "xxx")
.ToSql();
.ToSql(a => new
{
all = a,
subquery = g.sqlite.Select<ZX.Model.CustomerCheckupGroup>().Where(b => b.Id == a.Id).First(b => b.Group)
});
var teklksjdg333 = g.sqlite.Select<ZX.Model.CustomerCheckupGroup>()
.Where(a => true && a.CustomerMember.Group == "xxx")
.OrderBy(a => g.sqlite.Select<ZX.Model.CustomerCheckupGroup>().Where(b => b.Id == a.Id).First(b => b.Group))
.ToSql(a => new
{
all = a,
subquery = g.sqlite.Select<ZX.Model.CustomerCheckupGroup>().Where(b => b.Id == a.Id).First(b => b.Group)
});
var sklgjlskdg = g.sqlite.Select<ZX.Model.CustomerMember>()
.Where(a => a.CheckupGroups.AsSelect().Any())

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>

View File

@ -550,12 +550,19 @@ namespace FreeSql.Internal
}
if (callType.FullName.StartsWith("FreeSql.ISelect`"))
{ //子表查询
if (exp3.Method.Name == "Any")
{ //exists
switch (exp3.Method.Name)
{
case "Any": //exists
case "Count":
case "Sum":
case "Min":
case "Max":
case "Avg":
case "First":
var anyArgs = exp3.Arguments;
var exp3Stack = new Stack<Expression>();
var exp3tmp = exp3.Object;
if (exp3tmp != null && anyArgs.Any())
if (exp3.Method.Name == "Any" && exp3tmp != null && anyArgs.Any())
exp3Stack.Push(Expression.Call(exp3tmp, callType.GetMethod("Where", anyArgs.Select(a => a.Type).ToArray()), anyArgs.ToArray()));
while (exp3tmp != null)
{
@ -772,11 +779,36 @@ namespace FreeSql.Internal
fsqlWhere.Invoke(fsql, new object[] { Expression.Lambda(fsqlWhereExp, fsqlWhereParam) });
}
asSelectBefores.Clear();
switch (exp3.Method.Name)
{
case "Any":
var sql = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { "1" })?.ToString();
if (string.IsNullOrEmpty(sql) == false)
return $"exists({sql.Replace("\r\n", "\r\n\t")})";
break;
case "Count":
var sqlCount = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { "count(1)" })?.ToString();
if (string.IsNullOrEmpty(sqlCount) == false)
return $"({sqlCount.Replace("\r\n", "\r\n\t")})";
break;
case "Sum":
case "Min":
case "Max":
case "Avg":
var sqlSum = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({ExpressionLambdaToSql(exp3.Arguments.FirstOrDefault(), tsc)})" })?.ToString();
if (string.IsNullOrEmpty(sqlSum) == false)
return $"({sqlSum.Replace("\r\n", "\r\n\t")})";
break;
case "First":
var sqlFirst = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { ExpressionLambdaToSql(exp3.Arguments.FirstOrDefault(), tsc) })?.ToString();
if (string.IsNullOrEmpty(sqlFirst) == false)
return $"({sqlFirst.Replace("\r\n", "\r\n\t")})";
break;
}
}
asSelectBefores.Clear();
break;
}
}
//var eleType = callType.GetElementType() ?? callType.GenericTypeArguments.FirstOrDefault();

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql 数据库实现,基于 Oracle 11</Description>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql 数据库实现,基于 PostgreSQL 9.5</Description>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net451</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql 数据库实现,基于 SqlServer 2005+并根据版本适配分页方法row_number 或 offset fetch next</Description>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Version>0.7.7</Version>
<Version>0.7.8</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql 数据库实现,基于 Sqlite 3.0</Description>