将聚合结果分配给实体属性,而不是拉动所有子查询行

时间:2013-12-27 07:27:28

标签: c# sql linq

我对评论有评论和投票。

[Table("QAComment")]
public class QaComment : IEntity
{
    [Key, Column("QACommentID")]
    public int Id { get; set; }

    // ...

    public virtual ICollection<QaCommentVote> Votes { get; set; }

    [NotMapped]
    public int OverallVote { get; set; }
}

[Table("QACommentVote")]
public class QaCommentVote : IEntity
{
    [Key, Column("QACommentVoteID")]
    public int Id { get; set; }

    [ForeignKey("QAComment")]
    public int QaCommentId { get; set; }

    public int Value { get; set; }

    public virtual QaComment QaComment { get; set; }
}

我需要对他们的投票总数进行评论,不要将所有投票都拉到申请
我能看到的方式来实现这个目标:
1.为Commment创建一个数据库视图,并在那里计算投票总和 缺点:不想做额外的观点 2.通过LINQ:

var comments =
    Set<QaComment>()
        .Select(c => new QaComment() {/* assign every property once again and calc OverallVote */});  

缺点:不喜欢再次分配allproperties 是否有更好的方法没有这种缺点?

更新
这是我想要的LINQ结果:

SELECT 
    qac.*, 
    (SELECT SUM(v.Value)
     FROM QACommentVote v 
     WHERE v.QACommentID = qac.QACommentID) as OverallVote
FROM QAComment qac

1 个答案:

答案 0 :(得分:1)

您可以将QaComment和您要查找的总和作为匿名类型单独获取,并使用LINQ to Objects将它们合并到一个对象中:

var comments
    = Set<QaComment>()
      .Select(c => new { c, sum = c.Votes.Sum(v => v.Value))
      .AsEnumerable() // to make next query execute as LINQ to Objects query
      .Select(x => { x.c.OverallVote = x.sum; return x.c; })
      .ToList();

但要明确指出:我没有测试过:)