LINQ应用

下面是关于LINQ应用的一些场景,其中的相关要点在代码的注释中。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Text;
using System.Threading.Tasks;
using Service.StockService.Contract;

namespace Service.StockService.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // Nested query
                var nestedQueryResults = from publisher in DataContext.Publishers
                              select new
                              {
                                  Publisher = publisher.Name,
                                  Books = from book in DataContext.Books
                                          where book.Publisher == publisher
                                          select book
                              };

                // Group query
                var groupQueryResults = from book in DataContext.Books
                               group book by book.Publisher into publisherGroup
                               select new
                               {
                                   Publisher = publisherGroup.Key.Name,
                                   Books = publisherGroup
                               };

                var groupQueryResults2 = DataContext.Books
                    .GroupBy(book => book.Publisher)
                    .Select(publisherGroup => new
                    {
                        Publisher = publisherGroup.Key.Name, 
                        Books = publisherGroup
                    }); 

                // Group join query
                var groupJoinResults = from publisher in DataContext.Publishers
                               join book in DataContext.Books
                               on publisher equals book.Publisher into publisherBooks
                               select new
                               {
                                   Publisher = publisher.Name,
                                   Books = publisherBooks
                               };

                var groupJoinResults2 = DataContext.Publishers
                    .GroupJoin(DataContext.Books,
                    publisher => publisher,
                    book => book.Publisher,
                    (publisher, publisherBooks) => new
                    {
                        Publisher = publisher.Name, 
                        Books = publisherBooks
                    }); 

                // Inner join
                var innerJoinResults = from publisher in DataContext.Publishers
                               join book in DataContext.Books 
                               on publisher equals book.Publisher
                               select new { Publisher = publisher.Name, Book = book.Title };

                var innerJoinResults2 = DataContext.Publishers
                    .Join(DataContext.Books,
                    publisher => publisher,
                    book => book.Publisher,
                    (publisher, book) => new
                    {
                        Publisher = publisher.Name, 
                        Book = book.Title
                    }); 

                // Left outer join
                var leftOuterJoinResults = from publisher in DataContext.Publishers
                               join book in DataContext.Books
                               on publisher equals book.Publisher into publisherBooks
                               from book in publisherBooks.DefaultIfEmpty()
                               select new
                               {
                                   Publisher = publisher.Name, 
                                   Book = book == default(Book) ? "no books" : book.Title
                               };

                var leftOuterJoinResults2 = DataContext.Publishers
                    .GroupJoin(DataContext.Books,
                    publisher => publisher,
                    book => book.Publisher,
                    (publisher, publisherBooks) => new { Publisher = publisher, PublisherBooks = publisherBooks })
                    .SelectMany(group => group.PublisherBooks.DefaultIfEmpty(),
                    (group, book) => new { Publisher = group.Publisher.Name, Book = book == default(Book) ? "no books" : book.Title }); 

                // cross join
                var crossJoinResults = from publisher in DataContext.Publishers
                               from book in DataContext.Books
                               select new
                               {
                                   Publisher = publisher.Name, 
                                   Book = book.Title
                               };

                var crossJoinResults2 = DataContext.Publishers
                    .SelectMany(publisher => DataContext.Books,
                    (publisher, book) => new { Publisher = publisher.Name, Book = book.Title }); 


                // show index
                var indexResults = DataContext.Books
                    .Select((book, index) => new { Index = index, book.Title }); 

                // group by more than one condition
                var groupMoreConditionResults = from book in DataContext.Books
                                                group book by new { book.Publisher, book.Subject } into grouping
                                                select new
                                                {
                                                    Publisher = grouping.Key.Publisher.Name, 
                                                    Subject = grouping.Key.Subject.Name, 
                                                    Books = grouping
                                                }; 

                // load only title not the whole book object. 
                var groupMoreConditionResults2 = from book in DataContext.Books
                                                 group book.Title by new { book.Publisher, book.Subject } into grouping
                                                 select new
                                                 {
                                                     Publisher = grouping.Key.Publisher.Name,
                                                     Subject = grouping.Key.Subject.Name,
                                                     Books = grouping
                                                 };

                // load only title and publisher info. 
                var groupMoreConditionResults3 = from book in DataContext.Books
                                                 group new { book.Title, book.Publisher.Name } by new { book.Publisher, book.Subject } into grouping
                                                 select new
                                                 {
                                                     Publisher = grouping.Key.Publisher.Name,
                                                     Subject = grouping.Key.Subject.Name,
                                                     Books = grouping
                                                 };

                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                Console.WriteLine(); 
                foreach (var result in nestedQueryResults)
                {
                    Console.WriteLine("{0}", result.Publisher);
                    foreach (var book in result.Books)
                    {
                        Console.WriteLine("    {0}", book.Title); 
                    }
                }

                stopwatch.Stop(); 
                Console.WriteLine("Ticks {0}", stopwatch.ElapsedTicks);

                stopwatch.Restart();
                Console.WriteLine(); 
                foreach (var result in groupQueryResults)
                {
                    Console.WriteLine("{0}", result.Publisher);
                    foreach (var book in result.Books)
                    {
                        Console.WriteLine("    {0}", book.Title);
                    }
                }

                stopwatch.Stop(); 
                Console.WriteLine("Ticks {0}", stopwatch.ElapsedTicks);

                stopwatch.Start();
                Console.WriteLine("/***************Group join results****************/"); 
                foreach (var result in groupJoinResults2)
                {
                    Console.WriteLine("{0}", result.Publisher);
                    foreach (var book in result.Books)
                    {
                        Console.WriteLine("    {0}", book.Title);
                    }
                }

                stopwatch.Stop(); 
                Console.WriteLine("Ticks {0}", stopwatch.ElapsedTicks);

                Console.WriteLine("/***************Inner join results****************/"); 
                foreach (var result in innerJoinResults)
                {
                    Console.WriteLine("{0} {1}", result.Publisher, result.Book); 
                }

                Console.WriteLine("/***************Left outer join results****************/"); 
                foreach (var result in leftOuterJoinResults)
                {
                    Console.WriteLine("{0} {1}", result.Publisher, result.Book);
                }

                Console.WriteLine("/***************Cross join results****************/"); 
                foreach (var result in crossJoinResults)
                {
                    Console.WriteLine("{0} {1}", result.Publisher, result.Book);
                }

                Console.WriteLine("/***************Show index results****************/"); 
                foreach (var result in indexResults)
                {
                    Console.WriteLine("{0} {1}", result.Index, result.Title); 
                }

                Console.WriteLine("/***************Group more than one condition results****************/");
                foreach (var result in groupMoreConditionResults)
                {
                    Console.WriteLine("Publisher:{0} Subject:{1}", result.Publisher, result.Subject);
                    foreach (var book in result.Books)
                    {
                        Console.WriteLine(" {0}", book.Title); 
                    }
                }

                IEnumerable<Book> query =
                    System.Linq.Enumerable.Where<Book>(
                    delegate(Book book) { return book.Price > 30.0M; });

                LinqBooksDataContext context = new LinqBooksDataContext(); 

                var bookParam = Expression.Parameter(typeof(Book), "book");

                var query = context.Books.Where<Book>(Expression.Lambda<Func<Book, bool>>(
                    Expression.GreaterThan(
                    Expression.Property(
                    bookParam,
                    typeof(Book).GetProperty("Price")),
                    Expression.Constant(30M, typeof(decimal?))),
                    new ParameterExpression[] { bookParam })); 

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.ReadLine(); 
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值