public void TestLinqWhere()
{
var connectionString = GetConnectionString("TestLinqWhere");
var context = new MyEntityContext(connectionString);
// Setup
var programming = context.Skills.Create();
programming.Name = "Programming";
var projectManagement = context.Skills.Create();
projectManagement.Name = "Project Management";
var graphicDesign = context.Skills.Create();
graphicDesign.Name = "Graphic Design";
var pe = context.Persons.Create();
pe.Name = "Alex";
pe.Age = 30;
pe.MainSkill = programming;
var pb = context.Persons.Create();
pb.Name = "Bill";
pb.Age = 30;
pb.MainSkill = projectManagement;
var pf = context.Persons.Create();
pf.Name = "Freddie";
pf.Age = 30;
pf.MainSkill = graphicDesign;
var pd = context.Persons.Create();
pd.Name = "Dennis";
pd.Age = 29;
pd.Friends.Add(pe);
pd.MainSkill = programming;
var pc = context.Persons.Create();
pc.Name = "Carole";
pc.Age = 29;
pc.MainSkill = projectManagement;
var pa = context.Persons.Create();
pa.Name = "Annie";
pa.Age = 35;
pa.MainSkill = graphicDesign;
context.SaveChanges();
// Assert
Assert.AreEqual(6, context.Persons.Count());
var age30 = context.Persons.Where(p => p.Age.Equals(30));
Assert.AreEqual(3, age30.Count());
var older = context.Persons.Where(p => p.Age > 30);
Assert.AreEqual(1, older.Count());
var younger = context.Persons.Where(p => p.Age < 30);
Assert.AreEqual(2, younger.Count());
var startswithA = context.Persons.Where(p => p.Name.StartsWith("A"));
Assert.AreEqual(2, startswithA.Count());
var endsWithE = context.Persons.Where(p => p.Name.EndsWith("e"));
Assert.AreEqual(3, endsWithE.Count());
endsWithE = context.Persons.Where(p => p.Name.EndsWith("E", true, CultureInfo.CurrentUICulture));
Assert.AreEqual(3, endsWithE.Count());
endsWithE = context.Persons.Where(p => p.Name.EndsWith("E", false, CultureInfo.CurrentUICulture));
Assert.AreEqual(0, endsWithE.Count());
endsWithE = context.Persons.Where(p => p.Name.EndsWith("E", StringComparison.CurrentCultureIgnoreCase));
Assert.AreEqual(3, endsWithE.Count());
endsWithE = context.Persons.Where(p => p.Name.EndsWith("E", StringComparison.CurrentCulture));
Assert.AreEqual(0, endsWithE.Count());
var containsNi = context.Persons.Where(p => p.Name.Contains("ni"));
Assert.AreEqual(2, containsNi.Count());
var x = context.Persons.Where(p => Regex.IsMatch(p.Name, "^a.*e$", RegexOptions.IgnoreCase));
Assert.AreEqual(1, x.Count());
Assert.AreEqual("Annie", x.First().Name);
var annie = context.Persons.Where(p => p.Name.Equals("Annie")).FirstOrDefault();
Assert.IsNotNull(annie);
//annie = context.Persons.Where(p => p.Name.Equals("Annie")).SingleOrDefault();
//Assert.IsNotNull(annie);
var mainSkillsOfPeopleOver30 = from s in context.Skills where s.Expert.Age > 30 select s;
var results = mainSkillsOfPeopleOver30.ToList();
Assert.AreEqual(1, results.Count);
Assert.AreEqual("Graphic Design", results.First().Name);
//note - startswith and getchar are not supported
//note null is not supported
//not Count() is not supported
//var hasFriends = context.Persons.Where(p => p.Friends.Count() > 0);
//Assert.AreEqual(1, hasFriends.Count());
//note length is not supported
//var longNames = context.Persons.Where(p => p.Name.Length > 6);
//Assert.AreEqual(1, longNames.Count());
}