在Linq代码中创建新组时如何排序?

时间:2019-05-20 04:38:33

标签: linq

我是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

1 个答案:

答案 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升序对其进行排序。

简单的漫画卓悦!