2012-01-24 2 views
0

Я настроил систему меченияLINQ к SQL запросов системы тегов - Toxi

Я верю, что это «Toxi» решение со следующими таблицами:

Книги [идентификатор, автор, название] имеет много-ко-многим с

Метки [ид, тэгу]

BookHasT AG [идентификатор, BookID, TagID] стык стол

с помощью Linq-SQL Я хочу:

  • выбрать топ-20 самых популярных тегов и иметь их количество с ним
  • дано книги ID, получить всю информацию о книге, в том числе теги, связанные с ним
  • список всех книг, которые связаны с определенным тегом

Пожалуйста, помогите, я знаю, что это немного дерзко, и я знаю, что обычно так хочется, чтобы вы приложили усилия, но ради краткости я оставляю свои неудачные попытки.

+0

Что ваша модель класса выглядеть? Другими словами, например, у вас есть класс 'Book' с свойством' Tags', возвращающим список объектов «Tag», а vice verca - класс 'Tag' с свойством' Books', возвращающим список 'Book' '-Объекты? – Nailuj

+0

Нет, класс Book имеет свойство BookHasTag, а класс Tag имеет BookHasTag – raklos

+0

. Я бы предложил вам включить соответствующие части вашего кода. Это делает его намного проще придумать решение ... – Nailuj

ответ

1

Если я вас понимаю правильно, вы хотите что-то вроде этого:

выбрать топ-20 самых популярных тегов и иметь их количество вместе с ней

var lsTags=(
     from tag in db.Tags 
     select new 
     { 
      tag.id, 
      tag.tagName, 
      NbrOfTags= 
       (
        from hasTags in db.BookHasTag 
        where hasTags.tagId==tag.id 
        select hasTags.id 
       ).Count() 
     } 
    ).OrderByDescending(a=>a.NbrOfTags).Take(20).ToList(); 

дано книги ID, получить все информация о книге, в том числе теги, связанные с ним

var bookId=1; 
var lsBooksWithTags=(
     from book in db.Books 
     where book.id==bookId 
     select new 
     { 
      book.id, 
      book.author, 
      book.title, 
      Tags=(
        from bookHasTag in db.BookHasTag 
        join tags in db.Tags 
         on bookHasTag.tagId equals tags.id 
        where bookHasTag.bookId==book.id 
        select new 
        { 
         tags.id, 
         tags.tagName 
        } 
       ) 
     } 
    ).ToList(); 

список всех книг, которые связаны с определенным тегом

var tagId=1; 
var lsBooksByTagId=(
      from book in db.Books 
      where 
       (
        db.BookHasTag.Where(a=>a.tagId==tagId).Select(a=>a.bookId) 
       ).Contains(book.id) 
      select new 
      { 
       book.id, 
       book.author, 
       book.title 
      } 
     ).ToList(); 
+0

Отлично, это сработало. Спасибо за вашу помощь. Могу ли я просто спросить, будет ли каждый из них запускать только один запрос против db? – raklos

+1

Да, они будут. Если вы хотите, чтобы выражение sql использовало linqpad [link] (http://www.linqpad.net/) для перевода кода linq. Может быть, вы можете принять ответ? – Arion

Смежные вопросы