我是Linq的新手,所以我努力使代码正确无误。我正在使用LinqPad 5,并通过C#连接到Oracle数据库。
我需要显示每个出版商从表中获得的图书总数,并按出版商ID对其进行排序。按顺序排列是我受困的地方,因为我可以正确输出计数,但无法正确排列。
这是我正在使用的表(省略了一些无关的列)。
BOOK_ISBN BOOK_TITLE BOOK_PUBID
6541546 Birds and their cousins 4
3214996 Outer worlds 2
3313545 Cats, Cats, Cats 3
...
我尝试了多种书写方式,并将“ order by”放置在不同的位置。我意识到,将“ order by”放在组之前意味着它基本上无关紧要,并且没有区别。我尝试将订单放置在选择的新区域内,但它不断抛出错误,无法正常工作。
这是我尝试使用C#表达式的第一种方法。
from b in Books
.OrderByDescending(b => b.BookPubid)
group b.BookTitle by b.BookPubid into BooksbyPublisher
select new
{
PublisherId = BooksbyPublisher.Key,
Numberofbooks = BooksbyPublisher.Count()
}
这是我尝试使用C#语句的第二种方式。
var myQuery =
from b in Books
.OrderByDescending(b => b.BookPubid)
group b.BookTitle by b.BookPubid into BooksbyPublisher
select new
{
PublisherId = BooksbyPublisher.Key,
Numberofbooks = BooksbyPublisher.Count(),
};
myQuery.Dump();
我希望输出为:
PublisherId Numberofbooks
1 2
2 2
3 3
4 4
5 3
但是它显示为:
PublisherId Numberofbooks
1 2
2 2
4 4
5 3
3 3
答案 0 :(得分:0)
因此,您有一个Books
序列,并且要将这些Books
分组为同一发布者发布的Books
组(=具有相同的PublisherId
)。您要从Books
的每个组中选择几个属性。
您是对的,为此,您将使用Enumerable.GroupBy的重载之一
IQueryable<Book> books = ... // your input collection of books
var result = books.GroupBy(book => book.PublisherId, // make groups of books with same PublisherId
// parameter ResultSelector: from every publisherId, and all books that have this
// publisherId make one object:
(publisherId, booksWithThisPublisherId) => new
{
// Select the properties you want,
// in your example you want the PublisherId and the number of books of this Publisher
PublisherId = publisherId,
NumberOfBooks = booksWithThisPublisherId.Count(),
})
// and you want to sort them with ascending publisherId:
.OrderBy(publisherWithNrOfBooks => publisherWithNumberOfBooks.PublisherId);
换句话说:
获取您输入的“书籍”。使具有相同PublisherId的书籍组。在每个组中,创建一个新对象。该对象包含该组中所有书籍的通用PublisherId。还要计算该组中的图书数量。
最后,选择每个“出版商及其书数”,并按PublisherId升序对其进行排序。
简单的漫画卓悦!