Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Найти ошибку в LINQ-запросе

Есть БД, в ней есть таблицы:
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();

Комментариев нет:

Отправить комментарий