1

我有一个以Tag导航属性(集合)命名的实体,名为Articles. 有Tag一个名为ignore-property ArticleCount,用于保存相关联Article的计数(仅在运行时和在视图中使用-被数据库忽略)。看:

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; }

}

如何在ONETag查询中选择所有s (或一个),对 dataBase -in entity framework 4.1 code-first 进行查询,请使用 lambda 表达式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();

当然,这是否表现良好取决于每个标签的预期文章数。如果是几十个,这将合理地工作,同时比其他方法更清洁。如果是几百个,另一个更好。

现在,如果是这种情况,您应该使用匿名或命名的表示类型,而不是重用实体。

于 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();

这只是一个查询,副本发生在内存中。我相信除了将匿名结果对象复制到标签中之外别无他法ArticleCount,因为您不能直接投影到实体中,因此您不能使用Select(t => new Tag { ... });. 您可以使用另一个命名类型而不是匿名类型,但不能使用实体类型。

于 2011-09-26T19:22:06.663 回答