この仮想的な多対多の関係があるとします。
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)
});
基本的に、私の質問は次のとおりです。これらのうちどれがより効率的であり、より効率的な他の単一クエリはありますか? 次のように、これらのいずれかを 2 つの個別のクエリと比較するとどうなりますか。
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
};