0

我正在设计一个界面,用户可以在其中将 publicaiton 加入关键字,当他们这样做时,我想建议通常与所选关键字一起出现的其他关键字。诀窍是获得相关频率以及建议关键字的属性。

关键字类型 (EF) 具有以下字段:

int Id
string Text
string UrlString

...以及与 Publications 实体集的多对多关系。
我快到了。和 :

var overlappedKeywords =
            selectedKeyword.Publications.SelectMany(p => p.Keywords).ToList();

在这里,我得到了一些非常有用的东西:一个扁平化的关键字列表,每个关键字都在列表中重复,但它与 selectedKeyword 一起出现了很多次。

剩下的挑战:
所以我想计算每个关键字出现在这个列表中的次数,并将不同的关键字实体投影到一种新类型上,称为 KeywordCounts,具有与 Keyword 相同的字段但有一个额外的字段:int PublicationsCount,我将在其中填充重叠关键字中每个关键字的计数。我怎样才能做到这一点??

到目前为止,我已经尝试了 2 种方法:

var keywordCounts = overlappingKeywords
    .Select(oc => new KeywordCount
        {
            KeywordId = oc.Id,
            Text = oc.Text,
            UrlString = oc.UrlString,
            PublicationsCount = overlappingKeywords.Count(ok2 => ok2.Id == oc.Id)
        })
    .Distinct();

...PublicationsCount 正在正确填充,但 Distinct 在这里不起作用。(我必须为此创建一个 EqualityComarer 吗?为什么默认的 EqualityComarer 不起作用?)

var keywordCounts = overlappingKeywords
    .GroupBy(o => o.Id)
    .Select(c => new KeywordCount
        {
            Id = ???
            Text = ???
            UrlString = ???
            PublicationsCount = ???
        })

我对 GroupBy 不是很清楚。我似乎无法访问 Select 中的 'o',并且 c 没有与 Keyword 的任何属性相匹配

更新
我的第一种方法将使用传递给 .Distinct() 的简单 EqualityComparer :

class KeywordEqualityComparer : IEqualityComparer<KeywordCount>
{
    public bool Equals(KeywordCount k1, KeywordCount k2)
    {
        return k1.KeywordId== k2.KeywordId;
    }

    public int GetHashCode(KeywordCount k)
    {
        return k.KeywordId.GetHashCode();
    }
}

...但是 Slauma 的答案更可取(并且被接受),因为它不需要这个。对于 EF 实体实例的默认 EqualityComparer 是什么,我仍然感到困惑——它不会像我在上面所做的那样根据主要 id 进行比较吗?

4

1 回答 1

1

你第二次尝试是更好的方法。我认为完整的代码是:

var keywordCounts = overlappingKeywords
    .GroupBy(o => o.Id)
    .Select(c => new KeywordCount
    {
        Id = c.Key, 
        Text = c.Select(x => x.Text).FirstOrDefault(),
        UrlString = c.Select(x => x.UrlString).FirstOrDefault(),
        PublicationsCount = c.Count()
    })
    .ToList();

我猜这是 LINQ to Objects,因为似乎没有涉及 EF 上下文,而是一个 object overlappingKeywords,所以分组发生在内存中,而不是在数据库中。

于 2012-04-27T11:13:16.250 回答