Skip to content

Commit 02ab494

Browse files
2881028810
authored andcommitted
- 优化 ISelect.GroupBy 查询,增加 .Value 实现聚合源字段查询,ToList(a => a.Sum(a.Value.Score));
- 增加 Expression string.Concat;
1 parent ddd5e81 commit 02ab494

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+466
-86
lines changed

FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,59 @@ public void GroupBy() {
726726
arg1 = a.Avg(a.Key.mod4),
727727
ccc2 = a.Key.tt2 ?? "now()",
728728
//ccc = Convert.ToDateTime("now()"), partby = Convert.ToDecimal("sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)")
729+
ccc3 = a.Max(a.Value.Item3.Id)
729730
});
731+
732+
var testpid1 = g.mysql.Insert<TestTypeInfo>().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
733+
g.mysql.Insert<TestInfo>().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
734+
735+
var aggsql1 = select
736+
.GroupBy(a => a.Title)
737+
.ToSql(b => new {
738+
b.Key,
739+
cou = b.Count(),
740+
sum = b.Sum(b.Key),
741+
sum2 = b.Sum(b.Value.TypeGuid)
742+
});
743+
var aggtolist1 = select
744+
.GroupBy(a => a.Title)
745+
.ToList(b => new {
746+
b.Key,
747+
cou = b.Count(),
748+
sum = b.Sum(b.Key),
749+
sum2 = b.Sum(b.Value.TypeGuid)
750+
});
751+
752+
var aggsql2 = select
753+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
754+
.ToSql(b => new {
755+
b.Key.Title,
756+
b.Key.yyyy,
757+
758+
cou = b.Count(),
759+
sum = b.Sum(b.Key.yyyy),
760+
sum2 = b.Sum(b.Value.TypeGuid)
761+
});
762+
var aggtolist2 = select
763+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
764+
.ToList(b => new {
765+
b.Key.Title,
766+
b.Key.yyyy,
767+
768+
cou = b.Count(),
769+
sum = b.Sum(b.Key.yyyy),
770+
sum2 = b.Sum(b.Value.TypeGuid)
771+
});
772+
773+
var aggsql3 = select
774+
.GroupBy(a => a.Title)
775+
.ToSql(b => new {
776+
b.Key,
777+
cou = b.Count(),
778+
sum = b.Sum(b.Key),
779+
sum2 = b.Sum(b.Value.TypeGuid),
780+
sum3 = b.Sum(b.Value.Type.Parent.Id)
781+
});
730782
}
731783
[Fact]
732784
public void ToAggregate() {

FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FreeSql.DataAnnotations;
2+
using MySql.Data.MySqlClient;
23
using System;
34
using System.Collections.Generic;
45
using System.Linq;
@@ -16,6 +17,10 @@ public OtherTest() {
1617

1718
[Fact]
1819
public void Array() {
20+
int[] nullarr = null;
21+
Assert.Throws<MySqlException>(() => { select.Where(a => nullarr.Contains(a.testFieldInt)).ToList(); });
22+
Assert.Throws<MySqlException>(() => { select.Where(a => new int[0].Contains(a.testFieldInt)).ToList(); });
23+
1924
//in not in
2025
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
2126
var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();

FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,59 @@ public void GroupBy() {
622622
arg1 = a.Avg(a.Key.mod4),
623623
ccc2 = a.Key.tt2 ?? "now()",
624624
//ccc = Convert.ToDateTime("now()"), partby = Convert.ToDecimal("sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)")
625+
ccc3 = a.Max(a.Value.Item3.Id)
625626
});
627+
628+
var testpid1 = g.oracle.Insert<TestTypeInfo>().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
629+
g.oracle.Insert<TestInfo>().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
630+
631+
var aggsql1 = select
632+
.GroupBy(a => a.Title)
633+
.ToSql(b => new {
634+
b.Key,
635+
cou = b.Count(),
636+
sum = b.Sum(b.Key),
637+
sum2 = b.Sum(b.Value.TypeGuid)
638+
});
639+
var aggtolist1 = select
640+
.GroupBy(a => a.Title)
641+
.ToList(b => new {
642+
b.Key,
643+
cou = b.Count(),
644+
sum = b.Sum(b.Key),
645+
sum2 = b.Sum(b.Value.TypeGuid)
646+
});
647+
648+
var aggsql2 = select
649+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
650+
.ToSql(b => new {
651+
b.Key.Title,
652+
b.Key.yyyy,
653+
654+
cou = b.Count(),
655+
sum = b.Sum(b.Key.yyyy),
656+
sum2 = b.Sum(b.Value.TypeGuid)
657+
});
658+
var aggtolist2 = select
659+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
660+
.ToList(b => new {
661+
b.Key.Title,
662+
b.Key.yyyy,
663+
664+
cou = b.Count(),
665+
sum = b.Sum(b.Key.yyyy),
666+
sum2 = b.Sum(b.Value.TypeGuid)
667+
});
668+
669+
var aggsql3 = select
670+
.GroupBy(a => a.Title)
671+
.ToSql(b => new {
672+
b.Key,
673+
cou = b.Count(),
674+
sum = b.Sum(b.Key),
675+
sum2 = b.Sum(b.Value.TypeGuid),
676+
sum3 = b.Sum(b.Value.Type.Parent.Id)
677+
});
626678
}
627679
[Fact]
628680
public void ToAggregate() {

FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,54 @@ public void GroupBy() {
693693
arg1 = a.Avg(a.Key.mod4),
694694
ccc2 = a.Key.tt2 ?? "now()",
695695
//ccc = Convert.ToDateTime("now()"), partby = Convert.ToDecimal("sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)")
696+
ccc3 = a.Max(a.Value.Item3.Id)
696697
});
698+
699+
var testpid1 = g.pgsql.Insert<TestTypeInfo>().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
700+
g.pgsql.Insert<TestInfo>().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
701+
702+
var aggsql1 = select
703+
.GroupBy(a => a.Title)
704+
.ToSql(b => new {
705+
b.Key,
706+
cou = b.Count(),
707+
sum2 = b.Sum(b.Value.TypeGuid)
708+
});
709+
var aggtolist1 = select
710+
.GroupBy(a => a.Title)
711+
.ToList(b => new {
712+
b.Key,
713+
cou = b.Count(),
714+
sum2 = b.Sum(b.Value.TypeGuid)
715+
});
716+
717+
var aggsql2 = select
718+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
719+
.ToSql(b => new {
720+
b.Key.Title,
721+
b.Key.yyyy,
722+
723+
cou = b.Count(),
724+
sum2 = b.Sum(b.Value.TypeGuid)
725+
});
726+
var aggtolist2 = select
727+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
728+
.ToList(b => new {
729+
b.Key.Title,
730+
b.Key.yyyy,
731+
732+
cou = b.Count(),
733+
sum2 = b.Sum(b.Value.TypeGuid)
734+
});
735+
736+
var aggsql3 = select
737+
.GroupBy(a => a.Title)
738+
.ToSql(b => new {
739+
b.Key,
740+
cou = b.Count(),
741+
sum2 = b.Sum(b.Value.TypeGuid),
742+
sum3 = b.Sum(b.Value.Type.Parent.Id)
743+
});
697744
}
698745
[Fact]
699746
public void ToAggregate() {

FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,54 @@ public void GroupBy() {
624624
arg1 = a.Avg(a.Key.mod4),
625625
ccc2 = a.Key.tt2 ?? "now()",
626626
//ccc = Convert.ToDateTime("now()"), partby = Convert.ToDecimal("sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)")
627+
ccc3 = a.Max(a.Value.Item3.Id)
627628
});
629+
630+
var testpid1 = _sqlserverFixture.SqlServer.Insert<TestTypeInfo>().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
631+
_sqlserverFixture.SqlServer.Insert<TestInfo>().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
632+
633+
var aggsql1 = select
634+
.GroupBy(a => a.Title)
635+
.ToSql(b => new {
636+
b.Key,
637+
cou = b.Count(),
638+
sum2 = b.Sum(b.Value.TypeGuid)
639+
});
640+
var aggtolist1 = select
641+
.GroupBy(a => a.Title)
642+
.ToList(b => new {
643+
b.Key,
644+
cou = b.Count(),
645+
sum2 = b.Sum(b.Value.TypeGuid)
646+
});
647+
648+
var aggsql2 = select
649+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
650+
.ToSql(b => new {
651+
b.Key.Title,
652+
b.Key.yyyy,
653+
654+
cou = b.Count(),
655+
sum2 = b.Sum(b.Value.TypeGuid)
656+
});
657+
var aggtolist2 = select
658+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
659+
.ToList(b => new {
660+
b.Key.Title,
661+
b.Key.yyyy,
662+
663+
cou = b.Count(),
664+
sum2 = b.Sum(b.Value.TypeGuid)
665+
});
666+
667+
var aggsql3 = select
668+
.GroupBy(a => a.Title)
669+
.ToSql(b => new {
670+
b.Key,
671+
cou = b.Count(),
672+
sum2 = b.Sum(b.Value.TypeGuid),
673+
sum3 = b.Sum(b.Value.Type.Parent.Id)
674+
});
628675
}
629676
[Fact]
630677
public void ToAggregate() {

FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,59 @@ public void GroupBy() {
568568
arg1 = a.Avg(a.Key.mod4),
569569
ccc2 = a.Key.tt2 ?? "now()",
570570
//ccc = Convert.ToDateTime("now()"), partby = Convert.ToDecimal("sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)")
571+
ccc3 = a.Max(a.Value.Item3.Id)
571572
});
573+
574+
var testpid1 = g.sqlite.Insert<TestTypeInfo>().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
575+
g.sqlite.Insert<TestInfo>().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
576+
577+
var aggsql1 = select
578+
.GroupBy(a => a.Title)
579+
.ToSql(b => new {
580+
b.Key,
581+
cou = b.Count(),
582+
sum = b.Sum(b.Key),
583+
sum2 = b.Sum(b.Value.TypeGuid)
584+
});
585+
var aggtolist1 = select
586+
.GroupBy(a => a.Title)
587+
.ToList(b => new {
588+
b.Key,
589+
cou = b.Count(),
590+
sum = b.Sum(b.Key),
591+
sum2 = b.Sum(b.Value.TypeGuid)
592+
});
593+
594+
var aggsql2 = select
595+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
596+
.ToSql(b => new {
597+
b.Key.Title,
598+
b.Key.yyyy,
599+
600+
cou = b.Count(),
601+
sum = b.Sum(b.Key.yyyy),
602+
sum2 = b.Sum(b.Value.TypeGuid)
603+
});
604+
var aggtolist2 = select
605+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
606+
.ToList(b => new {
607+
b.Key.Title,
608+
b.Key.yyyy,
609+
610+
cou = b.Count(),
611+
sum = b.Sum(b.Key.yyyy),
612+
sum2 = b.Sum(b.Value.TypeGuid)
613+
});
614+
615+
var aggsql3 = select
616+
.GroupBy(a => a.Title)
617+
.ToSql(b => new {
618+
b.Key,
619+
cou = b.Count(),
620+
sum = b.Sum(b.Key),
621+
sum2 = b.Sum(b.Value.TypeGuid),
622+
sum3 = b.Sum(b.Value.Type.Parent.Id)
623+
});
572624
}
573625
[Fact]
574626
public void ToAggregate() {

FreeSql.Tests/UnitTest1.cs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,56 @@ class ServiceRequestNew {
5353

5454
[Fact]
5555
public void Test1() {
56+
var testpid1 = g.mysql.Insert<TestTypeInfo>().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
57+
g.mysql.Insert<TestInfo>().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
58+
59+
var aggsql1 = select
60+
.GroupBy(a => a.Title)
61+
.ToSql(b => new {
62+
b.Key,
63+
cou = b.Count(),
64+
sum = b.Sum(b.Key),
65+
sum2 = b.Sum(b.Value.TypeGuid)
66+
});
67+
var aggtolist1 = select
68+
.GroupBy(a => a.Title)
69+
.ToList(b => new {
70+
b.Key,
71+
cou = b.Count(),
72+
sum = b.Sum(b.Key),
73+
sum2 = b.Sum(b.Value.TypeGuid)
74+
});
75+
76+
var aggsql2 = select
77+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
78+
.ToSql(b => new {
79+
b.Key.Title,
80+
b.Key.yyyy,
81+
82+
cou = b.Count(),
83+
sum = b.Sum(b.Key.yyyy),
84+
sum2 = b.Sum(b.Value.TypeGuid)
85+
});
86+
var aggtolist2 = select
87+
.GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
88+
.ToList(b => new {
89+
b.Key.Title,
90+
b.Key.yyyy,
91+
92+
cou = b.Count(),
93+
sum = b.Sum(b.Key.yyyy),
94+
sum2 = b.Sum(b.Value.TypeGuid)
95+
});
96+
97+
var aggsql3 = select
98+
.GroupBy(a => a.Title)
99+
.ToSql(b => new {
100+
b.Key,
101+
cou = b.Count(),
102+
sum = b.Sum(b.Key),
103+
sum2 = b.Sum(b.Value.TypeGuid),
104+
sum3 = b.Sum(b.Value.Type.Parent.Parent.Id)
105+
});
56106

57107
var sqlrepos = g.sqlite.GetRepository<TestTypeParentInfo, int>();
58108
sqlrepos.Insert(new TestTypeParentInfo {
@@ -201,7 +251,9 @@ public void Test1() {
201251
.Having(a => a.Count() > 0 && a.Avg(a.Key.mod4) > 0 && a.Max(a.Key.mod4) > 0)
202252
.Having(a => a.Count() < 300 || a.Avg(a.Key.mod4) < 100)
203253
.OrderBy(a => a.Key.tt2)
204-
.OrderByDescending(a => a.Count()).ToSql(a => new { a.Key.mod4, a.Key.tt2, max = a.Max("a.id"), max2 = Convert.ToInt64("max(a.id)") });
254+
.OrderByDescending(a => a.Count()).ToSql(a => new {
255+
cou = a.Sum(a.Value.Item1.Id),
256+
a.Key.mod4, a.Key.tt2, max = a.Max("a.id"), max2 = Convert.ToInt64("max(a.id)") });
205257

206258
var groupbysql2 = g.mysql.Select<TestInfo>().From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s
207259
.Where(a => a.Id == 1)

FreeSql/FreeSql.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5-
<Version>0.5.4</Version>
5+
<Version>0.5.4.1</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>

FreeSql/Interface/Curd/ISelect/ISelect1.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ public interface ISelect<T1> : ISelect0<ISelect<T1>, T1> where T1 : class {
271271
/// </summary>
272272
/// <param name="key"></param>
273273
/// <returns></returns>
274-
ISelectGrouping<TKey> GroupBy<TKey>(Expression<Func<T1, TKey>> exp);
274+
ISelectGrouping<TKey, T1> GroupBy<TKey>(Expression<Func<T1, TKey>> exp);
275275

276276
/// <summary>
277277
/// 按列排序,OrderBy(a => a.Time)

0 commit comments

Comments
 (0)