2

我正在使用實體框架/流利的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查詢中,我必須包含兩個子集合,我認爲這是一個性能密集型操作。或者我也可以使用數據庫中的計算列。但我不喜歡把任何東西放在數據庫端。那麼,在不加載子集合或使用數據庫解決方案的情況下填充計算字段(主要是Count,Average等聚合操作)的最佳方式是什麼?

回答

0

如果你不想像存儲過程那樣使用數據庫解決方案或者在數據庫端使用計算列,那麼這給我們留下了一個我猜測的選項。在你的存儲庫中有一個方法,如GetRatings()或類似的東西,並使用該方法中的linq查詢來計算評分,當然LINQ to Entities會將該Linq查詢轉換爲原生SQL查詢,該查詢應該更快,因爲它本來就是數據庫。

0

隨着出使用數據庫解決方案...

LINQ的具有數/最大/平均值,求和,GROUPBY,不同....等於是拉回來的數據,一旦DB已經 「計算出它」 ,如計數或總和通常不是問題。 所以不需要拖回所有對象。

使用併發檢查在發回時保持完整性。即時間戳EF類型Rowversion,將是必要的

基本上用EF你把一個值的上下文和SAY保存。 所以要記住的關鍵是保存時,如何確保數據正常。 這就是Rowversion的作用。 (樂觀鎖定)

如果您正在更改的記錄自您讀取以來已更改,則失敗。 您重新閱讀/重新計算並重試。

但是,如果您的應用程序要求保守鎖定 然後this article from Ladislav is recommended reading 實際上EF並未提供悲觀鎖定。

然而,您可以使用暴露在EF上的方法調用數據庫,或者只調用數據庫。

Context.Database.ExecuteSqlCommand() 

注意默認EF不會讀取髒數據(即未提交讀)

一切,你仍然需要/想悲觀鎖旗語風格訪問數據後。 後來看到Application Lock on SQL server

YEP您將需要DB,除非你有一個排隊服務器方便;-)