//使用組鏈接
var GroupQuery = from publisher in SampleData.Publishers
join book in SampleData.Books
on publisher equals book.Publisher into publisherBooks
select new
{
PublisherName = publisher.Name,
Books = publisherBooks
};
//使用Group
var QueryByGroup = from book in SampleData.Books
group book by book.Publisher into grouping
select new
{
PublisherName = grouping.Key.Name,
Books = grouping
};
內鏈接與SqL中inner join同樣,即找出兩個序列的交集。以下例找出book中的Publisher存在於SampleData.Publishers的資料。ast
//join查詢語句
var joinQuery = from publisher in SampleData.Publishers
join book in SampleData.Books
on publisher equals book.Publisher
select new
{
PublisherName = publisher.Name,
BookName = book.Title
};泛型
//join操做符語句
SampleData.Publishers.Join(
SampleData.Books, //join 對象
publisher => publisher, //外部的key
book => book.Publisher, //內部的key
(publisher, book) => new //結果
{
PublisherName = publisher.Name,
BookName = book.Title
});
左外鏈接與SqL中left join同樣。以下例找出根據publisher中找出SampleData.Publishers中全部資料和book中存在於publisher的資料。
//left join, 爲空時用default
var leftJoinQuerybyDefault = from publisher in SampleData.Publishers
join book in SampleData.Books
on publisher equals book.Publisher into publisherBooks
from book in publisherBooks.DefaultIfEmpty()
select new
{
PublisherName = publisher.Name,
BookName = (book == default(Book)) ? "no book" : book.Title
};
注:上例中使用了DefaultIfEmpty操做符,它可以爲實序列提供一個默認的元素。DefaultIfEmpty使用了泛型中的default關鍵字。default關鍵字對於引用類型將返回null,而對於值類型則返回0。對於結構體類型,則會根據其成員類型將它們相應地初始化爲null(引用類型)或0(值類型)。
//left join, 爲空時使用默認對象
var leftJoinQuery = from publisher in SampleData.Publishers
join book in SampleData.Books
on publisher equals book.Publisher into publisherBooks
from book in publisherBooks.DefaultIfEmpty(
new Book { Title = "" } //設置爲空時的默認值
)
select new
{
PublisherName = publisher.Name,
BookName = book.Title
};
var crossJoinQuery = from publisher in SampleData.Publishers
from book in SampleData.Books
select new
{
PublisherName = publisher.Name,
BookName = book.Title
};
//不使用查詢表達式
SampleData.Publishers.SelectMany(publisher => SampleData.Books.Select(
book => new
{
PublisherName = publisher.Name,
BookName = book.Title
}
));
static public class SampleData { static public Publisher[] Publishers = { new Publisher {Name="FunBooks"}, new Publisher {Name="Joe Publishing"}, new Publisher {Name="I Publisher"} }; static public Author[] Authors = { new Author {FirstName="Johnny", LastName="Good"}, new Author {FirstName="Graziella", LastName="Simplegame"}, new Author {FirstName="Octavio", LastName="Prince"}, new Author {FirstName="Jeremy", LastName="Legrand"} }; static public Subject[] Subjects = { new Subject {Name="Software development"}, new Subject {Name="Novel"}, new Subject {Name="Science fiction"} }; static public Book[] Books = { new Book { Title="Funny Stories", Publisher=Publishers[0], Authors=new[]{Authors[0], Authors[1]}, PageCount=101, Price=25.55M, PublicationDate=new DateTime(2004, 11, 10), Isbn="0-000-77777-2", Subject=Subjects[0] }, new Book { Title="LINQ rules", Publisher=Publishers[1], Authors=new[]{Authors[2]}, PageCount=300, Price=12M, PublicationDate=new DateTime(2007, 9, 2), Isbn="0-111-77777-2", Subject=Subjects[0] }, new Book { Title="C# on Rails", Publisher=Publishers[1], Authors=new[]{Authors[2]}, PageCount=256, Price=35.5M, PublicationDate=new DateTime(2007, 4, 1), Isbn="0-222-77777-2", Subject=Subjects[0] }, new Book { Title="All your base are belong to us", Publisher=Publishers[1], Authors=new[]{Authors[3]}, PageCount=1205, Price=35.5M, PublicationDate=new DateTime(2006, 5, 5), Isbn="0-333-77777-2", Subject=Subjects[2] }, new Book { Title="Bonjour mon Amour", Publisher=Publishers[0], Authors=new[]{Authors[1], Authors[0]}, PageCount=50, Price=29M, PublicationDate=new DateTime(1973, 2, 18), Isbn="2-444-77777-2", Subject=Subjects[1] } }; }