コード例 #1
0
 public IRepositoryQueryable <TResult> Join <TJoinKey, TInner, TResult>(IRepositoryQueryable <TInner> innerRepository, Expression <Func <T, TJoinKey> > outerKeySelector,
                                                                        Expression <Func <TInner, TJoinKey> > innerKeySelector, Expression <Func <T, TInner, TResult> > resultSelector)
     where TInner : class
     where TResult : class
 {
     return(Repository.Join(innerRepository, outerKeySelector, innerKeySelector, resultSelector));
 }
コード例 #2
0
        public override IRepositoryQueryable <TResult> Join <TJoinKey, TInner, TResult>(IRepositoryQueryable <TInner> innerRepository, Expression <Func <T, TJoinKey> > outerKeySelector, Expression <Func <TInner, TJoinKey> > innerKeySelector, Expression <Func <T, TInner, TResult> > resultSelector)
        {
            var innerQuery = innerRepository.AsQueryable();
            var outerQuery = BaseQuery();

            var innerType = innerRepository.GetType();
            var outerType = GetType();

            // if these are 2 different Repository types then let's bring down each query into memory so that they can be joined
            // if they are the same type then they will use the native IQueryable and take advantage of the back-end side join if possible
            if (innerType.Name != outerType.Name)
            {
                innerQuery = innerQuery.ToList().AsQueryable();
                outerQuery = outerQuery.ToList().AsQueryable();
            }
            var query = outerQuery.Join(innerQuery, outerKeySelector, innerKeySelector, resultSelector);

            SetTraceInfo("Join", query);

            return(new CompositeRepository <TResult>(query));
        }
コード例 #3
0
        public void CanAggregate()
        {
            // First create some test data for the queries.
            IRepository <Product> repoCrud = GetRepo();
            var products = GetSampleProducts();

            repoCrud.DeleteAll();
            products.ForEach(p => repoCrud.Create(p));

            // NOTES:
            // 1. The Repository<T>'s base class is RepositoryQueryable.
            // 2. We are only using a IRepository<T> here initially for adding in-memory test data.
            // 3. But this could be initialized via new RepositoryQuerable(...) constructors against a real Database.
            // 4. Notice that IRepositoryQueryable does not know anything about the entity(Product).
            IRepositoryQueryable repo = (IRepositoryQueryable)repoCrud;

            // 0. Named filters first, to show their example in each section min, max, group, etc.
            repo.AddNamedFilter("InStock Filter", Query.New().Where("IsInStock").Is(true));
            repo.AddNamedFilter("Expensive", Query.New().Where("Cost").MoreThan(20));

            // 1. GROUPING
            var groups  = repo.Group <int>("Cost");
            var groups2 = repo.Group <int>("Cost", Query.New().Where("Make").Not("Honda"));
            var groups3 = repo.Group <int>("Cost", "Expensive"); // same as groups2.

            // 2. DISTINCT
            var names  = repo.Distinct <string>("Make");
            var names2 = repo.Distinct <string>("Make", Query.New().Where("Cost").MoreThan(30).OrderByDescending("Make"));
            var names3 = repo.Distinct <string>("Make", "Expensive");

            // 3. COUNT
            var count1 = repo.Count();
            var count2 = repo.Count(Query <object> .New().Where("Make").Is("Toyota").And("IsInStock").Is(true));
            var count3 = repo.Count("InStock Filter");

            // 4. MIN, MAX, AVG, SUM
            int    count = repo.Count();
            double min   = repo.Min("Cost");
            double min2  = repo.Min("Cost", Query.New().Where("Make").In <string>("Bmw", "Lexus"));
            double min3  = repo.Min("Cost", "InStock Filter");

            double max  = repo.Max("Cost");
            double max2 = repo.Max("Cost", Query.New().Where("Make").NotIn <string>("Bmw", "Mercedes", "Lexus"));
            double max3 = repo.Max("Cost", "InStock Filter");

            double sum  = repo.Sum("Cost");
            double sum2 = repo.Sum("Cost", Query.New().Where("Make").In <string>("Honda", "Toyota").And("IsInStock").Is(true));
            double sum3 = repo.Sum("Cost", "InStock Filter");

            double avg  = repo.Avg("Cost");
            double avg2 = repo.Avg("Cost", Query.New().Where("Make").Like("Nissan"));
            double avg3 = repo.Avg("Cost", "InStock Filter");

            // 5. To Table
            DataTable all  = repo.ToTable();
            DataTable all2 = repo.ToTable(Query.New().Where("Make").Is("Honda"));
            DataTable all3 = repo.ToTable("InStock Filter");

            // 6. Exists
            bool any1 = repo.Any(Query.New().Where("IsInStock").Is(true));
            bool any2 = repo.Any("InStock Filter");

            // 7. Limit number of records.
            repo.ToTable(Query.New().Limit(2));
            var table1 = repo.ToTable(Query.New().Select("Make", "Model").Where("Cost").MoreThan(30).Limit(2));

            // Check min
            double minLinq  = products.Min(p => p.Cost);
            double min2Linq = products.Where(p => (p.Make == "Bmw" || p.Make == "Lexus")).Min(p => p.Cost);
            double min3Linq = products.Where(p => p.IsInStock).Min(p => p.Cost);

            double maxLinq  = products.Max(p => p.Cost);
            double max2Linq = products.Where(p => (p.Make != "Bmw" && p.Make != "Mercedes" && p.Make != "Lexus")).Max(p => p.Cost);
            double max3Linq = products.Where(p => p.IsInStock).Max(p => p.Cost);

            double sumLinq  = products.Sum(p => p.Cost);
            double sum2Linq = products.Where(p => (p.Make == "Honda" || p.Make == "Toyota") && p.IsInStock == true).Sum(p => p.Cost);
            double sum3Linq = products.Where(p => p.IsInStock).Sum(p => p.Cost);

            double avgLinq  = products.Average(p => p.Cost);
            double avg2Linq = products.Where(p => p.Make == "Nissan").Average(p => p.Cost);
            double avg3Linq = products.Where(p => p.IsInStock).Average(p => p.Cost);

            int countLinq  = products.Count;
            int count2Linq = products.Where(p => p.Make == "Toyota" && p.IsInStock).Count();
            int count3Linq = products.Where(p => p.IsInStock).Count();

            // Check count
            Assert.AreEqual(count1, countLinq);
            Assert.AreEqual(count2, count2Linq);
            Assert.AreEqual(count3, count3Linq);

            // Check min
            Assert.AreEqual(min, minLinq);
            Assert.AreEqual(min2, min2Linq);
            Assert.AreEqual(min3, min3Linq);

            // Check max
            Assert.AreEqual(max, maxLinq);
            Assert.AreEqual(max2, max2Linq);
            Assert.AreEqual(max3, max3Linq);

            // Check sum
            Assert.AreEqual(sum, sumLinq);
            Assert.AreEqual(sum2, sum2Linq);
            Assert.AreEqual(sum3, sum3Linq);

            // Check avg
            Assert.AreEqual(avg.ToString().Substring(0, 7), avgLinq.ToString().Substring(0, 7));
            Assert.AreEqual(avg2.ToString().Substring(0, 7), avg2Linq.ToString().Substring(0, 7));
            Assert.AreEqual(avg3.ToString().Substring(0, 7), avg3Linq.ToString().Substring(0, 7));
        }
コード例 #4
0
 public abstract IRepositoryQueryable <TResult> Join <TJoinKey, TInner, TResult>(IRepositoryQueryable <TInner> innerRepository, Expression <Func <T, TJoinKey> > outerKeySelector, Expression <Func <TInner, TJoinKey> > innerKeySelector, Expression <Func <T, TInner, TResult> > resultSelector)
     where TInner : class
     where TResult : class;
コード例 #5
0
        /// <summary>
        /// Run the application.
        /// </summary>
        public override BoolMessageItem Execute()
        {
            // First create some test data for the queries.
            IRepository <Product> repoCrud = new RepositoryInMemory <Product>();
            var products = GetSampleProducts();

            products.ForEach(p => repoCrud.Create(p));

            // NOTES:
            // 1. The Repository<T>'s base class is RepositoryQueryable.
            // 2. We are only using a IRepository<T> here initially for adding in-memory test data.
            // 3. But this could be initialized via new RepositoryQuerable(...) constructors against a real Database.
            // 4. Notice that IRepositoryQueryable does not know anything about the entity(Product).
            IRepositoryQueryable repo = (IRepositoryQueryable)repoCrud;

            // 0. Named filters first, to show their example in each section min, max, group, etc.
            repo.AddNamedFilter("InStock Filter", Query <object> .New().Where("IsInStock").Is(true));
            repo.AddNamedFilter("Expensive", Query <object> .New().Where("Cost").MoreThan(20));

            // 1. GROUPING
            var groups  = repo.Group <int>("Cost");
            var groups2 = repo.Group <int>("Cost", Query <object> .New().Where("Make").Not("Honda"));
            var groups3 = repo.Group <int>("Cost", "Expensive"); // same as groups2.

            // 2. DISTINCT
            var names  = repo.Distinct <string>("Make");
            var names2 = repo.Distinct <string>("Make", Query <object> .New().Where("Cost").MoreThan(30).OrderByDescending("Make"));
            var names3 = repo.Distinct <string>("Make", "Expensive");

            // 3. COUNT
            var count1 = repo.Count();
            var count2 = repo.Count(Query <object> .New().Where("IsInStock").Is(true));
            var count3 = repo.Count("InStock Filter");

            // 4. MIN, MAX, AVG, SUM
            int    count = repo.Count();
            double min   = repo.Min("Cost");
            double min2  = repo.Min("Cost", Query <object> .New().Where("Make").In <string>("Bmw", "Lexus"));
            double min3  = repo.Min("Cost", "InStock Filter");

            double max  = repo.Max("Cost");
            double max2 = repo.Max("Cost", Query <object> .New().Where("Make").NotIn <string>("Bmw", "Lexus"));
            double max3 = repo.Max("Cost", "InStock Filter");

            double sum  = repo.Sum("Cost");
            double sum2 = repo.Sum("Cost", Query <object> .New().Where("Make").In <string>("Honda", "Toyota").And("IsInStock").Is(true));
            double sum3 = repo.Sum("Cost", "InStock Filter");

            double avg  = repo.Avg("Cost");
            double avg2 = repo.Avg("Cost", Query <object> .New().Where("Make").Like("Nissan"));
            double avg3 = repo.Avg("Cost", "InStock Filter");

            // 5. To Table
            DataTable all  = repo.ToTable();
            DataTable all2 = repo.ToTable(Query <object> .New().Where("Make").Is("Honda"));
            DataTable all3 = repo.ToTable("InStock Filter");

            // 6. Exists
            bool any1 = repo.Any(Query <object> .New().Where("IsInStock").Is(true));
            bool any2 = repo.Any("InStock Filter");

            // 7. Limit number of records.
            repo.ToTable(Query <object> .New().Limit(2));
            var table1 = repo.ToTable(Query <object> .New().Select("Make", "Model").Where("Cost").MoreThan(30).Limit(2));

            return(BoolMessageItem.True);
        }