【问题标题】:linq to sql querying a tag system - toxilinq to sql 查询标签系统 - toxi
【发布时间】:2012-01-24 10:05:24
【问题描述】:

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

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

书籍[id,author,title]

有多对多的关系

标签[id, tagName]

BookHasTag[id, bookId, tagId] 联结表

使用 linq-sql 我想:

  • 选择前 20 个最受欢迎的标签并计算它们的数量
  • 给定一个图书 ID,获取有关图书的所有信息,包括与其关联的标签
  • 与特定标签关联的所有书籍的列表

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

【问题讨论】:

  • 你的班级模型是什么样的?换句话说,你是否有一个 Book 类和一个 Tags 属性返回一个 Tag-objects 列表,反之亦然,一个 Tag 类和一个 Books 属性返回一个 @987654326 列表@-objects?
  • 不,Book类有BookHasTag属性,Tag类有BookHasTag
  • 我建议您包含代码的相关部分。这使得提出解决方案变得更加容易......

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


【解决方案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();

【讨论】:

  • 太好了,这很好。谢谢你的帮助。我可以问一下 - 这些中的每一个都只会对数据库运行一个查询吗?
  • 是的,他们会的。如果您想查看 sql 语句,请使用 linqpad link 来翻译 linq 代码。或许你可以接受这个答案?
猜你喜欢
  • 2010-10-03
  • 2023-04-06
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多