实体框架 - 使用导航属性计算不同的书籍 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 例程。
谢谢你的时间。:)
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();
}