实体框架 - 使用导航属性计算不同的书籍 pr. 标记

本文关键字:标记 pr 计算 框架 属性 导航 实体 | 更新日期: 2023-09-27 18:32:43

我有一个与"标签"具有多对多关系的表"书",需要一个不同的书数pr.标签。在 SQL 中,查询如下所示:

SELECT t.NAME,
count(DISTINCT b.BookId)
FROM _Tag t
JOIN Book.BookTag bt
ON t.Id = bt.TagId
JOIN Books b
ON b.BookId = bt.BookId
GROUP BY t.NAME
ORDER BY count(DISTINCT b.BookId) DESC;

我已经获取了标签并包含了 Books 导航属性,从中我应该能够获得不同的 BookID 的 pr. 标签名称。我想在元组中获得结果。

到目前为止,我已经尝试了以下方法:

var tagTuples = from tag in tags
join book in tags.Select(t => t.Books) on tag.Books equals book
group new {tag, book} by tag.Name
into g
select new Tuple<string, string, int>("tags", g.Key, g.Select(x => x.book).Count());

。和。。。

var tagTuples = tags.GroupBy(t => t.Name)
.Select(t2 => new Tuple<string, string, int>("tags", t2.Key, t2.Sum(t4 => t4.Books
.Select(b => b.BookId).Distinct().Count())))
.Where(t3 => !string.IsNullOrWhiteSpace(t3.Item2)).Take(15);

。和我的最新版本:

var tagTuples =
tags.Select(t => new {t.Name, BookId = t.Books.Select(b => b.BookId)})
.GroupBy(tb => tb.Name)
.Select(tb2 => new Tuple<string, string, int>("tags", tb2.Key, tb2.Sum(tb3 => tb3.BookId.Distinct().Count())));

没关系查询中的微小差异 - 我只对上述问题的解决方案感兴趣。

挫折!编写执行此操作的 SQL 查询需要 2 分钟,我很确定有一个简单的答案,但我缺乏 EF 例程。

谢谢你的时间。:)

实体框架 - 使用导航属性计算不同的书籍 pr. 标记

using(var ctx = new EntitiesContext())
{
                                  // GROUP By name
    var bookCountByTag = ctx.Tags.GroupBy(t => t.Name)
                            .Select(t2 => new { 
                                // SELECT the key (tag name)
                                t2.Key, 
                                // "GroupBy" has many result, so use SelectMany
                                Count = t2.SelectMany(t3 => t3.book)
                                          .Distinct()
                                          .Count()})
                            .ToList();
}