linq to sql查询标签系统 - toxi

时间:2012-01-24 10:05:24

标签: c# sql linq linq-to-sql

我已经建立了一个标记系统

我相信它是带有下表的“toxi”解决方案:

图书 [id,作者,标题] 有多对多的关系

代码 [id,tagName]

BookHasTag [id,bookId,tagId] junction-table

使用linq-sql我想:

  • 选择前20个最受欢迎的代码并使用它来计算
  • 给出书籍ID,获取有关该书的所有信息,包括与之相关的标签
  • 与特定标记关联的所有图书的列表

请你帮忙,我知道这有点厚颜无耻,而且我知道通常喜欢看到你付出了努力,但为了简洁起见,我忽略了我失败的尝试。

1 个答案:

答案 0 :(得分: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();