实体框架4.1计算相同的数据库行

时间:2012-01-05 20:19:35

标签: c# asp.net-mvc-3 entity-framework entity-relationship

我的设置

我有两个类,这里​​显示的是本例中需要的内容:

public class Photo : Entity
{
    [Key]
    public int Id { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }

    public Photo()
    {
        Tags = new List<Tag>();
    }
}


public class Tag : Entity
{
    [Key]
    public string Text { get; set; }

    public virtual ICollection<Photo> Photos { get; set; }

    public Tag()
    {
        Photos = new List<Photo>();
    }
}

如上所示,两个实体之间存在多对多关系

我正在使用EF 4.1代码优先。

示例:

  • photo1 ”在其代码导航中包含“ tag1 ”,“ tag2 ”和“ tag3 ”属性。
  • photo2 ”在其代码导航中包含“ tag2 ”,“ tag3 ”和“ tag4 ”属性。
  • photo3 ”在其代码导航属性中包含“ tag2 ”和“ tag4 ”。

所有照片中的总代码数量:

  • “tag1”:1
  • “tag2”:3
  • “tag3”:2
  • “tag4”:2
  • 总标签数:8

注意

我的最终目标是这个标签云,但是使用MVC3:

http://www.geekzilla.co.uk/View960C74AE-D01B-428E-BCF3-E57B85D5A308.htm

第一个问题

我如何(使用EF)找出最常用标签的使用次数(找到“ tag2 ”的数量)? 最少使用的标签也是如此(上例中“ tag1 ”的数量)。

在上面的链接中使用以下代码行:

double.TryParse(tagData.Compute("min(count)", null).ToString(), out min);
double.TryParse(tagData.Compute("max(count)", null).ToString(), out max);

什么是EF / LINQ等价物?

第二个问题

如何获取每个标签的计数或50个最常用标签的计数?

1 个答案:

答案 0 :(得分:2)

按标记计算:

from t in Context.Tags
select new
{
    t.Text,
    t.Photos.Count()
}

最常用的标签:

(from t in Context.Tags
let photoCount = t.Photos.Count()
orderby photoCount descending
select new
{
    t.Text,
    photoCount
}).FirstOrDefault()

50个最常用的标签(实际上可能没有50个):

(from t in Context.Tags
let photoCount = t.Photos.Count()
orderby photoCount descending
select new
{
    t.Text,
    photoCount
}).Take(50)

徒手,所以可能不是100%语法正确或最小/最易读的方式。

编辑:添加示例:

foreach(var result in Context.Tags.Select(x => new { t.Text, t.Photos.Count() }))
{
    Console.WriteLine(string.Format("Text: {0}, Count: {1}", result.Text, result.Count.ToString());
}