下面是关于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();
}
}
}
}