1

Tagという名前のナビゲーション プロパティ (コレクション) を持つエンティティがありますArticles。には、関連付けられたカウントを保存するために使用されるTag名前の無視されたプロパティがあります(実行時およびビューで使用するため-DBに対して無視されます)。見る:ArticleCountArticle

public class Tag{

    public int Id { get; set; }

    public int Title { get; set; }

    public virtual ICollection<Article> Articles { get; set; }

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

}

データベースに対する 1 つのクエリですべてTags (または 1 つ)を選択するにはどうすればよいですか?ArticleCount

4

2 に答える 2

2
var tagsAndCounts =  from tag in context.Tags
                     where ...
                     select new { tag, count = tag.Articles.Count() }
var tagsWithCount = tagsAndCounts.ToList()
                                 .Select(x => 
                                         {
                                             x.tag.ArticleCount = x.count;
                                             return x.tag;
                                         };

(私はこれを別の方法で設計します-ArticleCountモデルの一部であってはならず、または上の投影である必要があります。これArticlesを使用して熱心にロードできますInclude()。しかし、これはあなたが望むことを行います)


更新:私のデザイン。

public class Tag
{
   ...
   public int ArticleCount { get { return Articles.Count; } }
}

var tagsWithEagerLoadedArticles = context.Tags.Include(x => x.Articles)
                                         .Where(...).Etc();

もちろん、これがうまく機能するかどうかは、タグごとに予想される記事数によって異なります。数十の場合、これは他のアプローチよりもクリーンでありながら、合理的に機能します。数百の場合は、もう1つが優れています。

その場合は、エンティティを再利用するのではなく、匿名または名前付きのプレゼンテーションタイプを使用する必要があります。

于 2011-09-26T19:21:40.330 に答える
1

すべてのタグの例:

var result = context.Tags
    .Select(t => new
    {
        Tag = t,
        ArticleCount = t.Articles.Count()
    });

foreach (var a in result)
    a.Tag.ArticleCount = a.ArticleCount;

var tags = result.Select(a => a.Tag).ToList();

これは1つのクエリのみであり、コピーはメモリ内で行われます。ArticleCountエンティティに直接投影することはできないため、を使用することはできないため、匿名の結果オブジェクトからタグにコピーする以外に方法はないと思いますSelect(t => new Tag { ... });。匿名タイプの代わりに別の名前付きタイプを使用できますが、エンティティタイプは使用できません。

于 2011-09-26T19:22:06.663 に答える