using System.Collections.Generic;
using System.Data.Entity;
using System.Linq.Dynamic.Core;
static readonly Random Rnd = new Random(1);
public static void Main()
GroupBy_SingleKey_SingleResult();
GroupBy_SingleKey_MultiResult();
GroupBy_SingleKey_Count();
private static void GroupBy_SingleKey()
Console.WriteLine(nameof(GroupBy_SingleKey));
var context = new EntityContext();
var result = context.Posts.GroupBy("BlogId").ToDynamicArray();
for (int i = 0; i < result.Length; i++)
var expectedRow = result[i];
var testRow = (IGrouping<int, Post>) result[i];
Console.WriteLine("Key (BlogId) = {0}", testRow.Key);
Console.WriteLine("PostTitles = {0}", string.Join(", ", testRow.Select(x => $"'{x.Title}'")));
private static void GroupBy_MultiKey()
Console.WriteLine(nameof(GroupBy_MultiKey));
var context = new EntityContext();
var result = context.Posts.GroupBy("new (BlogId, PostDate)").OrderBy("Key.PostDate").ToDynamicArray();
for (int i = 0; i < result.Length; i++)
var expectedRow = result[i];
var testRow = (IGrouping<DynamicClass, Post>) result[i];
Console.WriteLine("Key.BlogId = {0}", ((dynamic)testRow.Key).BlogId);
Console.WriteLine("Key.PostDate = {0}", ((dynamic)testRow.Key).PostDate);
Console.WriteLine("PostTitles = {0}", string.Join(", ", testRow.Select(x => $"'{x.Title}'")));
private static void GroupBy_SingleKey_SingleResult()
Console.WriteLine(nameof(GroupBy_SingleKey_SingleResult));
var context = new EntityContext();
var result = context.Posts.GroupBy("PostDate", "Title").ToDynamicArray();
for (int i = 0; i < result.Length; i++)
var expectedRow = result[i];
var testRow = (IGrouping<DateTime, string>) result[i];
Console.WriteLine("Key (PostDate) = {0}", testRow.Key);
Console.WriteLine("PostTitles = {0}", string.Join(", ", testRow.Select(x => $"'{x}'")));
private static void GroupBy_SingleKey_MultiResult()
Console.WriteLine(nameof(GroupBy_SingleKey_MultiResult));
var context = new EntityContext();
var result = context.Posts.GroupBy("PostDate", "new (Title, Content)").ToDynamicArray();
for (int i = 0; i < result.Length; i++)
var expectedRow = result[i];
var testRow = (IGrouping<DateTime, DynamicClass>) result[i];
Console.WriteLine("Key (PostDate) = {0}", testRow.Key);
Console.WriteLine("PostTitles with Content = {0}", string.Join(", ", testRow.Cast<dynamic>().Select(x => $"'{x.Title}' : '{x.Content}'")));
private static void GroupBy_SingleKey_Count()
Console.WriteLine(nameof(GroupBy_SingleKey_Count));
var context = new EntityContext();
var result = context.Posts.GroupBy("BlogId").Select("new(Key, Count() AS Count)").ToDynamicArray();
for (int i = 0; i < result.Length; i++)
var expectedRow = result[i];
Console.WriteLine("Key (BlogId) = {0}, Count = {1}", testRow.Key, testRow.Count);
private static void GroupBy_SingleKey_Sum()
Console.WriteLine(nameof(GroupBy_SingleKey_Sum));
var context = new EntityContext();
var result = context.Posts.GroupBy("BlogId").Select("new(Key, Sum(NumberOfReads) AS TotalReads)").ToDynamicArray();
for (int i = 0; i < result.Length; i++)
var expectedRow = result[i];
Console.WriteLine("Key (BlogId) = {0}, TotalReads = {1}", testRow.Key, testRow.TotalReads);
private static void GenerateData(int blogCount)
using (var context = new EntityContext())
for (int i = 0; i < blogCount; i++)
var blog = new Blog { Name = "Blog" + (i + 1), Created = DateTime.Now.AddDays(-Rnd.Next(0, 100)) };
for (int j = 0; j < Rnd.Next(2, 5); j++)
Title = $"Blog {i + 1} - Post {j + 1}",
Content = "My Content " + Rnd.Next(100, 200),
PostDate = DateTime.Today.AddDays(-Rnd.Next(0, 100)).AddSeconds(Rnd.Next(0, 30000)),
NumberOfReads = Rnd.Next(0, 100)
public class EntityContext : DbContext
public EntityContext() : base(FiddleHelper.GetConnectionStringSqlServer())
public DbSet<Post> Posts { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public int? NullableInt { get; set; }
public virtual ICollection<Post> Posts { get; set; }
public DateTime Created { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
public int NumberOfReads { get; set; }
public DateTime PostDate { get; set; }