public void GroupBy()
        {
            //Arrange
            var testList = User.GenerateSampleModels(100);
            var qry      = testList.AsQueryable();

            //Act
            var byAgeReturnUserName = qry.GroupBy("Profile.Age", "UserName");
            var byAgeReturnAll      = qry.GroupBy("Profile.Age");

            //Assert
            Assert.AreEqual(testList.GroupBy(x => x.Profile.Age).Count(), byAgeReturnUserName.Count());
            Assert.AreEqual(testList.GroupBy(x => x.Profile.Age).Count(), byAgeReturnAll.Count());
        }
        public void GroupByMany_LambdaExpressions()
        {
            var lst = new List <Tuple <int, int, int> >()
            {
                new Tuple <int, int, int>(1, 1, 1),
                new Tuple <int, int, int>(1, 1, 2),
                new Tuple <int, int, int>(1, 1, 3),
                new Tuple <int, int, int>(2, 2, 4),
                new Tuple <int, int, int>(2, 2, 5),
                new Tuple <int, int, int>(2, 2, 6),
                new Tuple <int, int, int>(2, 3, 7)
            };

            var sel = lst.AsQueryable().GroupByMany(x => x.Item1, x => x.Item2);

            Assert.AreEqual(sel.Count(), 2);
            Assert.AreEqual(sel.First().Subgroups.Count(), 1);
            Assert.AreEqual(sel.Skip(1).First().Subgroups.Count(), 2);
        }
        public void Where()
        {
            //Arrange
            var testList = User.GenerateSampleModels(100, allowNullableProfiles: true);
            var qry      = testList.AsQueryable();


            //Act
            var userById         = qry.Where("Id=@0", testList[10].Id);
            var userByUserName   = qry.Where("UserName=\"User5\"");
            var nullProfileCount = qry.Where("Profile=null");
            var userByFirstName  = qry.Where("Profile!=null && Profile.FirstName=@0", testList[1].Profile.FirstName);


            //Assert
            Assert.AreEqual(testList[10], userById.Single());
            Assert.AreEqual(testList[5], userByUserName.Single());
            Assert.AreEqual(testList.Count(x => x.Profile == null), nullProfileCount.Count());
            Assert.AreEqual(testList[1], userByFirstName.Single());
        }
        public void Join()
        {
            //Arrange
            Person magnus = new Person {
                Name = "Hedlund, Magnus"
            };
            Person terry = new Person {
                Name = "Adams, Terry"
            };
            Person charlotte = new Person {
                Name = "Weiss, Charlotte"
            };

            Pet barley = new Pet {
                Name = "Barley", Owner = terry
            };
            Pet boots = new Pet {
                Name = "Boots", Owner = terry
            };
            Pet whiskers = new Pet {
                Name = "Whiskers", Owner = charlotte
            };
            Pet daisy = new Pet {
                Name = "Daisy", Owner = magnus
            };

            List <Person> people = new List <Person> {
                magnus, terry, charlotte
            };
            List <Pet> pets = new List <Pet> {
                barley, boots, whiskers, daisy
            };


            //Act
            var realQuery = people.AsQueryable().Join(
                pets,
                person => person,
                pet => pet.Owner,
                (person, pet) =>
                new { OwnerName = person.Name, Pet = pet.Name });

            var dynamicQuery = people.AsQueryable().Join(
                pets,
                "it",
                "Owner",
                "new(outer.Name as OwnerName, inner.Name as Pet)");

            //Assert
            var realResult = realQuery.ToArray();

#if NET35 || DNXCORE50
            var dynamicResult = dynamicQuery.Cast <object>().ToArray();

            Assert.AreEqual(realResult.Length, dynamicResult.Length);
            for (int i = 0; i < realResult.Length; i++)
            {
                Assert.AreEqual(realResult[i].OwnerName, dynamicResult[i].GetDynamicProperty <string>("OwnerName"));
                Assert.AreEqual(realResult[i].Pet, dynamicResult[i].GetDynamicProperty <string>("Pet"));
            }
#else
            var dynamicResult = dynamicQuery.ToDynamicArray();

            Assert.AreEqual(realResult.Length, dynamicResult.Length);
            for (int i = 0; i < realResult.Length; i++)
            {
                Assert.AreEqual(realResult[i].OwnerName, dynamicResult[i].OwnerName);
                Assert.AreEqual(realResult[i].Pet, dynamicResult[i].Pet);
            }
#endif
        }