【发布时间】:2013-02-21 07:41:38
【问题描述】:
假设我有这种假设的多对多关系:
public class Paper
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Author> Authors { get; set; }
}
public class Author
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Paper> Papers { get; set; }
}
我想使用 LINQ 构建一个查询,该查询将为我提供每位作者与其他作者相比的“受欢迎程度”,即作者贡献的论文数量除以所有作者贡献的总数量文件。我想出了几个查询来实现这一点。
选项 1:
var query1 = from author in db.Authors
let sum = (double)db.Authors.Sum(a => a.Papers.Count)
select new
{
Author = author,
Popularity = author.Papers.Count / sum
};
选项 2:
var temp = db.Authors.Select(a => new
{
Auth = a,
Contribs = a.Papers.Count
});
var query2 = temp.Select(a => new
{
Author = a,
Popularity = a.Contribs / (double)temp.Sum(a2 => a2.Contribs)
});
基本上,我的问题是:其中哪一个更有效,还有其他单个查询更有效吗?其中任何一个与两个单独的查询相比如何,如下所示:
double sum = db.Authors.Sum(a => a.Papers.Count);
var query3 = from author in db.Authors
select new
{
Author = author,
Popularity = author.Papers.Count / sum
};
【问题讨论】:
-
您是否查看过您的每种方法在数据库级别的作用?这将是最重要的方面。一旦您知道发出了什么 SQL - 并且一旦您查看了该 SQL 的查询计划 - 您将处于一个更好的位置。
-
您还有一个选择:加入分组并按组计算论文。正如 Jon Skeet 所说,要选择最好的方式来分析输出 sql。
标签: c# linq entity-framework-5