public void TestOrderedDistinct()
{
var connectionString = GetConnectionString("TestOrderedDistinct");
var context = new MyEntityContext(connectionString);
var alice = context.Persons.Create();
alice.Name = "Alice";
var bob = context.Persons.Create();
bob.Name = "Bob";
var carol = context.Persons.Create();
carol.Name = "Carol";
var programming = context.Skills.Create();
programming.Name = "Programming";
var csharp = context.Skills.Create();
csharp.Name = "C#";
csharp.Parent = programming;
csharp.SkilledPeople.Add(alice);
csharp.SkilledPeople.Add(bob);
var vb = context.Skills.Create();
vb.Name = "Visual Basic";
vb.Parent = programming;
vb.SkilledPeople.Add(alice);
vb.SkilledPeople.Add(carol);
var fsharp = context.Skills.Create();
fsharp.Name = "F#";
fsharp.Parent = programming;
fsharp.SkilledPeople.Add(alice);
context.SaveChanges();
//var allProgrammers =
// context.Skills.Where(x => x.Parent.Id.Equals(programming.Id)).SelectMany(s => s.SkilledPeople).ToList();
//// No distinct so we will get alice three times
//Assert.That(allProgrammers.Count, Is.EqualTo(5));
//Assert.That(allProgrammers.Where(p=>p.Name.Equals("alice")), Is.EqualTo(3));
var allProgrammersDistinct =
context.Skills.Where(x => x.Parent.Id.Equals(programming.Id)).SelectMany(s => s.SkilledPeople).Distinct().ToList();
// Distinct so we will get alice only once
Assert.That(allProgrammersDistinct.Count, Is.EqualTo(3));
Assert.That(allProgrammersDistinct.Count(p => p.Name.Equals("Alice")), Is.EqualTo(1));
var allProgrammersOrderedDistinct =
context.Skills.Where(x => x.Parent.Id.Equals(programming.Id)).SelectMany(s => s.SkilledPeople).OrderByDescending(p=>p.Name).Distinct().ToList();
// Distinct so we will get alice only once
Assert.That(allProgrammersOrderedDistinct.Count, Is.EqualTo(3));
Assert.That(allProgrammersOrderedDistinct[0].Name, Is.EqualTo("Carol"));
Assert.That(allProgrammersOrderedDistinct[1].Name, Is.EqualTo("Bob"));
Assert.That(allProgrammersOrderedDistinct[2].Name, Is.EqualTo("Alice"));
}