2013-11-29 2 views
4

Я создаю библиотечную систему ASP.NET C#. Снимите снимок экрана (MSSQL) DB-design: DB-design:LINQ query join only last value

Чтобы отобразить книги, я использую таблицу Аренда. Но есть моя проблема:

  • Я оставил присоединиться к таблице книги с таблицей Rentals (потому что и книги, которые еще не сданы в аренду один раз, нужно будет отображаться (см книгу с идентификатором 3)
  • Когда я только левый присоединиться, я вижу, что мои книги Offcourse несколько раз в моих книгах-обзоре ...
  • SO: Я нужен запрос LINQ, который соединяет книги с Rentals, но если книги уже были арендовал несколько раз, он должен только присоединиться с последнего значения в таблице этого book_id
  • Посмотрите на изображение ниже: запрос должен выбрать только зеленые выбранные значения ...
  • (дополнительная информация: если кто-то взять книгу, то Возвращаемое значение = 0, если он возвращает книгу, она становится 1)

Example data of tables

запрос у меня сейчас:

var query = (from b in db.Books 
        join a in db.Authors on b.author_id equals a.author_id 
        join c in db.Categories on b.category_id equals c.category_id 
        join r in db.Rentals on b.book_id equals r.book_id into lf 
        from r in lf.DefaultIfEmpty() 
        select new BookDetails(
           b.book_id, 
           b.title, 
           b.ISBN, 
           b.description, 
           b.author_id, 
           a.firstName, 
           a.lastName, 
           b.category_id, 
           r.returned == null ? 1 : r.returned) 
        ).ToList(); 

Но, как я уже сказал, это показывает мне арендованные книги несколько раз ... Я думал о чем-то с свойством «MAX»? (но это работает с linq?)

ответ

2

Вы можете сгруппировать книги по идентификатору книги, а затем выбрать первый элемент из каждой группы. Это аккуратный способ моделирования «отличных». В вашем случае это будет

var query = (from b in db.Books 
      join a in db.Authors on b.author_id equals a.author_id 
      join c in db.Categories on b.category_id equals c.category_id 
      join r in db.Rentals on b.book_id equals r.book_id into lf 
      from r in lf.DefaultIfEmpty() 
      group new{ Book = b, Author = a, Rental = r } 
       by b.book_id into booksById 
      let item = booksById.First() 
      select new BookDetails(
       item.Book.book_id, 
       item.Book.title, 
       item.Book.ISBN, 
       item.Book.description, 
       item.Book.author_id, 
       item.Author.firstName, 
       item.Author.lastName, 
       item.Book.category_id, 
       item.Rental.returned == null 
        ? 1 : item.Rental.returned)) 
      .ToList(); 
+1

Благодарим за помощь! Как я могу получить «a» и «r» в выбранных новых BookDetails? Они больше не существуют ... – francisMi

+0

О, вы правы, вам придется добавить их в совокупность. Я отредактирую свой ответ. –