我正在使用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等)的最佳方法是什么?
答案 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服务器; - )