Entity framework 使用实体框架实现计算字段的最佳方式是什么?

Entity framework 使用实体框架实现计算字段的最佳方式是什么?,entity-framework,ef-code-first,fluent-interface,computed-field,Entity Framework,Ef Code First,Fluent Interface,Computed Field,我正在使用实体框架/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 publ

我正在使用实体框架/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; }
}
公共课复习
{
public int Id{get;private set;}
公共浮点平均值{get;private set;}//计算字段
public int totalikes{get;private set;}//计算字段
公共列表评级{get;private set;}
公共列表类似于{get;private set;}
}
公共等级评定
{
public int CustomerId{get;private set;}
public int ReviewId{get;private set;}
公共整数评级{get;set;}
}
公共类
{
public int CustomerId{get;private set;}
public int ReviewId{get;private set;}
}

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

如果您不想使用存储过程之类的数据库解决方案或在数据库端使用计算列,那么我想这就给我们留下了一个选择。也就是说,在您的存储库中有一个方法,如
GetRatings()
或类似的方法,并在该方法中使用linq查询来计算评级,当然linq to Entities会将该linq查询转换为本机SQL查询,因为它是数据库的本机查询,所以速度应该更快

没有使用数据库解决方案

Linq有count/max/average、Sum、groupby、distinct。。。。因此,一旦数据库“计算”了数据(如计数或求和整数),就将数据拉回来通常不是问题。 因此,无需向后拖动所有对象

使用并发检查在回传时保持完整性。ie时间戳EF类型Rowversion,将是必需的

基本上,对于EF,你在上下文中输入一个值,然后说Save。 因此,要记住的关键是在保存时,如何确保数据正常。 这就是Rowversion的角色。(乐观锁定)

如果要更改的记录在读取后已更改,则失败。 您已重新读取/重新读取并重试

但是,如果应用程序需要悲观锁定 然后 本质上EF不提供悲观锁定

但是,您可以使用EF上公开的方法调用DB,或者只调用DB

Context.Database.ExecuteSqlCommand()
注意:默认情况下,EF不会读取脏数据。(即,没有未提交的读取)

毕竟,您仍然需要/想要悲观锁定信号量样式来访问数据。 那就看

是的,您需要数据库,除非您手边有排队服务器;-)