Есть БД, в ней есть таблицы:
Checkout (Checkout key, ReaderID, BookID LibrarianID, Checkout Date, Return Date)
Authors (AuthorID, FirstName, MiddleName, LastName)
Books (BookID, Title, AuthorID, GenreID, ImprintID, Quantity).
Наверное уже догадались, что в таблице Books содержится информация о книгах, в таблице Authors инфо об авторах, а в таблице Checkout инфо о выдаче книг.
В своем запросе я хотел получить что-то вроде рейтинга выдачи, какие книги больше всего выдавались и отсортировать полученную таблицу по кол-ву выдач.
using (var db = new LibraryContext()) {
var query = (from che in db.Checkout
group che by che.BookID into g
from che in g
from boo in db.Books where boo.BookID == che.BookID
from aut in db.Authors where aut.AuthorID == boo.AuthorID
select new {
FirstName = aut.FirstName,
MiddleName = aut.MiddleName,
LastName = aut.LastName,
Title = boo.Title,
Count = g.Count(),
}
).OrderBy(p => p.Count).Distinct().ToList();
this.dataGridView.DataSource = query;
this.dataGridView.Refresh();
}
В итоге полученные данные вывести в новую таблицу: ФИО автора, Название книги, Кол-во выдач.
Все получилось, кроме сортировки. Не получается отсортировать в конце по количеству выдач. Помогите :)
Ответ
Ошибка видимо в отсутствии join-ов в запросе.
from che in g
from boo in db.Books where boo.BookID == che.BookID
from aut in db.Authors where aut.AuthorID == boo.AuthorID
Для примера упростил классы:
public class Book
{
public string id { get; set; }
public string name { get; set; }
public string authorId { get; set; }
}
public class Author
{
public string id { get; set; }
public string name { get; set; }
}
public class Checkout
{
public string id { get; set; }
public string bookId { get; set; }
}
вспомнил литературу:
authors.Add(new Author() { id = "1", name = "Тургенев" });
authors.Add(new Author() { id = "2", name = "Гоголь" });
authors.Add(new Author() { id = "3", name = "Есенин" });
books.Add(new Book() { id = "1", name = "отцы и дети", authorId = "1" });
books.Add(new Book() { id = "2", name = "вий", authorId = "2" });
books.Add(new Book() { id = "3", name = "белая береза", authorId = "3" });
checkouts.Add(new Checkout() { id = "1", bookId = "1" });
checkouts.Add(new Checkout() { id = "2", bookId = "1" });
checkouts.Add(new Checkout() { id = "3", bookId = "1" });
checkouts.Add(new Checkout() { id = "4", bookId = "1" });
checkouts.Add(new Checkout() { id = "5", bookId = "1" });
checkouts.Add(new Checkout() { id = "6", bookId = "1" });
checkouts.Add(new Checkout() { id = "7", bookId = "2" });
checkouts.Add(new Checkout() { id = "8", bookId = "2" });
checkouts.Add(new Checkout() { id = "9", bookId = "2" });
checkouts.Add(new Checkout() { id = "10", bookId = "2" });
checkouts.Add(new Checkout() { id = "71", bookId = "2" });
checkouts.Add(new Checkout() { id = "81", bookId = "2" });
checkouts.Add(new Checkout() { id = "91", bookId = "2" });
checkouts.Add(new Checkout() { id = "101", bookId = "2" });
checkouts.Add(new Checkout() { id = "11", bookId = "3" });
переписал:
var res = (from c in checkouts
group c by c.bookId into g
join b in books on g.Key equals b.id
join a in authors on b.authorId equals a.id
select new
{
author = a.name,
book = b.name,
rating = g.Count()
})
.OrderByDescending(i => i.rating)
.ToList();
или на методах расширения:
var res = checkouts.GroupBy(g => g.bookId)
.Select(i => new { bookId = i.Key, cnt = i.Count() })
.Join(books, g => g.bookId, b => b.id, (g, b) => new { book = b, info = g })
.Join(authors, g => g.book.authorId, a => a.id,
(g, a) => new {
bookName = g.book.name,
authorName = a.name,
cnt = g.info.cnt })
.OrderByDescending(g => g.cnt)
.ToList();
Комментариев нет:
Отправить комментарий