使用Entity Framework实现计算字段的最优化方法是什么?

时间:2013-06-27 10:57:22

标签: entity-framework ef-code-first fluent-interface computed-field

我正在使用Entity Framework / Fluent API,我是他们的新手。在我的场景中,我有以下三个类。

public class Review
{
    public int Id { get; private set; }
    public float AverageRating { get; private set; } //Computed Field
    public int TotalLikes { get; private set; } //Computed Field
    public List<Rating> Ratings { get; private set;}
    public List<Like> Likes { get; private set;}
}
public class Rating
{
    public int CustomerId { get; private set; }
    public int ReviewId { get; private set; }
    public int Rating { get; set; }
}
public class Like
{
    public int CustomerId { get; private set; }
    public int ReviewId { get; private set; }
}

我对所有三个班级及其关系都有Fluent映射。在复习课中,我有两个计算字段。我可以填充子集合中的计算字段(评级和喜欢)。在Linq查询的情况下,我必须包括两个子集合,我认为这是一个性能密集型操作。或者,我也可以在DB中使用计算列。但我不喜欢在数据库方面放任何东西。那么,在不加载子集合或使用数据库解决方案的情况下,填充计算字段(主要是聚合操作,如Count,Average等)的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

如果您不想在数据库端使用数据库解决方案(如存储过程或使用计算列),那么我猜这会留下一个选项。这在您的存储库中有一个方法,如GetRatings()或类似的东西,并在该方法中使用linq查询来计算评级,当然LINQ to Entities会将Linq查询转换为本机SQL查询,该查询应该更快,因为它是数据库的原生。

答案 1 :(得分:0)

  

不使用数据库解决方案......

Linq有计数/最大/平均,Sum,groupby,distinct ....等因此,一旦DB“计算了”,就会将数据拉回来,例如计数或总和通常不是问题。 所以不需要拖回所有对象。

使用并发检查在发布回来时保持完整性。即时间戳EF类型Rowversion,将是必要的

基本上使用EF,您在上下文中放置一个值并SAY Save。 所以要记住的关键是保存时,如何确保数据正常。 这就是Rowversion的作用。 (乐观锁定)

如果您正在更改的记录,则在您阅读后更改,则会失败。 您重新阅读/重新计算并重试。

但是,如果您的应用程序需要悲观锁定 然后this article from Ladislav is recommended reading 基本上EF不提供悲观锁定。

但是,您可以使用EF上公开的方法调用数据库,或者只调用数据库。

Context.Database.ExecuteSqlCommand()

默认情况下注意EF不读取脏数据(即没有未提交的读数)

毕竟你仍然需要/想要悲观锁定信号量样式来访问数据。 然后看Application Lock on SQL server

YEP你将需要数据库,除非你有一个方便的ENQUEUE服务器; - )