@@ -598,5 +598,133 @@ protected class OrderItem
598
598
public DateTime ? ShippingDate { get ; set ; }
599
599
public DateTime ? CancellationDate { get ; set ; }
600
600
}
601
+
602
+ [ ConditionalTheory ]
603
+ [ MemberData ( nameof ( IsAsyncData ) ) ]
604
+ public virtual async Task GroupBy_Aggregate_over_navigations_repeated ( bool async )
605
+ {
606
+ var contextFactory = await InitializeAsync < Context27083 > ( seed : c => c . Seed ( ) ) ;
607
+ using var context = contextFactory . CreateContext ( ) ;
608
+
609
+ var query = context
610
+ . Set < TimeSheet > ( )
611
+ . Where ( x => x . OrderId != null )
612
+ . GroupBy ( x => x . OrderId )
613
+ . Select ( x => new
614
+ {
615
+ HourlyRate = x . Min ( f => f . Order . HourlyRate ) ,
616
+ CustomerId = x . Min ( f => f . Project . Customer . Id ) ,
617
+ CustomerName = x . Min ( f => f . Project . Customer . Name ) ,
618
+ } ) ;
619
+
620
+ var timeSheets = async
621
+ ? await query . ToListAsync ( )
622
+ : query . ToList ( ) ;
623
+
624
+ Assert . Equal ( 2 , timeSheets . Count ) ;
625
+ }
626
+
627
+ [ ConditionalTheory ]
628
+ [ MemberData ( nameof ( IsAsyncData ) ) ]
629
+ public virtual async Task Aggregate_over_subquery_in_group_by_projection ( bool async )
630
+ {
631
+ var contextFactory = await InitializeAsync < Context27083 > ( seed : c => c . Seed ( ) ) ;
632
+ using var context = contextFactory . CreateContext ( ) ;
633
+
634
+ Expression < Func < Order , bool > > someFilterFromOutside = x => x . Number != "A1" ;
635
+
636
+ var query = context
637
+ . Set < Order > ( )
638
+ . Where ( someFilterFromOutside )
639
+ . GroupBy ( x => new { x . CustomerId , x . Number } )
640
+ . Select ( x => new
641
+ {
642
+ x . Key . CustomerId ,
643
+ CustomerMinHourlyRate = context . Set < Order > ( ) . Where ( n => n . CustomerId == x . Key . CustomerId ) . Min ( h => h . HourlyRate ) ,
644
+ HourlyRate = x . Min ( f => f . HourlyRate ) ,
645
+ Count = x . Count ( )
646
+ } ) ;
647
+
648
+ var orders = async
649
+ ? await query . ToListAsync ( )
650
+ : query . ToList ( ) ;
651
+
652
+ Assert . Collection ( orders ,
653
+ t => Assert . Equal ( 10 , t . CustomerMinHourlyRate ) ,
654
+ t => Assert . Equal ( 20 , t . CustomerMinHourlyRate ) ) ;
655
+ }
656
+
657
+ protected class Context27083 : DbContext
658
+ {
659
+ public Context27083 ( DbContextOptions options )
660
+ : base ( options )
661
+ {
662
+ }
663
+
664
+ public DbSet < TimeSheet > TimeSheets { get ; set ; }
665
+ public DbSet < Customer > Customers { get ; set ; }
666
+
667
+ public void Seed ( )
668
+ {
669
+ var customerA = new Customer { Name = "Customer A" } ;
670
+ var customerB = new Customer { Name = "Customer B" } ;
671
+
672
+ var projectA = new Project { Customer = customerA } ;
673
+ var projectB = new Project { Customer = customerB } ;
674
+
675
+ var orderA1 = new Order { Number = "A1" , Customer = customerA , HourlyRate = 10 } ;
676
+ var orderA2 = new Order { Number = "A2" , Customer = customerA , HourlyRate = 11 } ;
677
+ var orderB1 = new Order { Number = "B1" , Customer = customerB , HourlyRate = 20 } ;
678
+
679
+ var timeSheetA = new TimeSheet { Order = orderA1 , Project = projectA } ;
680
+ var timeSheetB = new TimeSheet { Order = orderB1 , Project = projectB } ;
681
+
682
+ AddRange ( customerA , customerB ) ;
683
+ AddRange ( projectA , projectB ) ;
684
+ AddRange ( orderA1 , orderA2 , orderB1 ) ;
685
+ AddRange ( timeSheetA , timeSheetB ) ;
686
+ SaveChanges ( ) ;
687
+ }
688
+ }
689
+
690
+ protected class Customer
691
+ {
692
+ public int Id { get ; set ; }
693
+
694
+ public string Name { get ; set ; }
695
+
696
+ public List < Project > Projects { get ; set ; }
697
+ public List < Order > Orders { get ; set ; }
698
+ }
699
+
700
+ protected class Order
701
+ {
702
+ public int Id { get ; set ; }
703
+ public string Number { get ; set ; }
704
+
705
+ public int CustomerId { get ; set ; }
706
+ public Customer Customer { get ; set ; }
707
+
708
+ public int HourlyRate { get ; set ; }
709
+ }
710
+
711
+ protected class Project
712
+ {
713
+ public int Id { get ; set ; }
714
+ public int CustomerId { get ; set ; }
715
+
716
+ public Customer Customer { get ; set ; }
717
+ }
718
+
719
+ protected class TimeSheet
720
+ {
721
+ public int Id { get ; set ; }
722
+
723
+ public int ProjectId { get ; set ; }
724
+ public Project Project { get ; set ; }
725
+
726
+ public int ? OrderId { get ; set ; }
727
+ public Order Order { get ; set ; }
728
+ }
601
729
}
602
730
}
0 commit comments