实体框架 - 计算不同的书籍。标签使用导航属性

时间:2016-01-30 16:41:57

标签: c# entity-framework

我有一个表“Book”,与“Tag”有多对多的关系,需要一个独特的Book-count 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;

我已经获取了标签并包含了图书导航属性,因此我应该可以获得不同的BookId的公关。标签名称。我希望得到一个元组的结果。

到目前为止,我已尝试过以下内容:

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例程。

谢谢你的时间。 :)

1 个答案:

答案 0 :(得分:2)

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();
}