0

在我正在處理的項目中,我有DebtCollectionCase對象,其中包含Invoices, Payments, CreditNotes等...我遇到的問題是查詢數量一直在增加,並且它會繼續增加在這些查詢中我有很多重複的計算。例如,計算得到UnpaidAmountInterest。這已經是一團糟了,隨着時間的推移它會變得更糟。在查詢中複製業務邏輯

解決方法是將這些計算放在域對象中,然後在函數中使用,然後在每個地方都可以重複使用,但要做到這一點,我需要在內存中獲取整個聚合,這意味着應該提取DebtCollectionCase, Invoices, Payments, CreditNotes然後調用函數來進行計算。對於單個記錄應該是可以的,但是當我需要這些記錄的列表時,可以使用其發票和付款對DebtCollection案例進行追查。這將是一個大量的數據獲取,它可能會影響性能。

所以這是一個在內存計算中做的問題,它對於可重用性和維護性更好,並將bussines邏輯放在查詢中,這意味着更好的性能但更難維護和違反DRY。有沒有人有任何建議我應該使用的方法?

+0

很可能你的域名設計不好。更具體地說,它似乎'DebtCollectionCase'「聚合」是絕對太大,並不真正反映您的業務不變量。所以,我會從重新思考你的模型開始。如果你仍然認爲它是可以的(或者你不能改變它),我會選擇特殊的「投影」只讀模型,這是由數據庫高效查詢(存儲庫模式可能適合你)支持的。請讓我知道,如果我明白你的問題。 –

+0

還有第三個選項,它將結果中的計算結果緩存在屬性中並將它們存儲在數據庫中。它的複雜部分現在變成確保當狀態的某些部分發生變化時可以重新計算屬性(反應式編程技術可能會有所幫助),但它允許在保留查詢的同時保持業務邏輯在域中簡單而高效。 – plalx

+0

我找到了一個解決方案,它被稱爲DelegateDecompiler。它可以讓你在linq Select和Where語句中使用實體未映射的屬性和函數,這意味着它們是可重用的,並且被轉換爲SQL,因此我不需要在內存中獲取實體。這是鏈接,如果有人需要https://github.com/hazzik/DelegateDecompiler。 – Aleksa

回答

1

我找到了一個解決方案,它叫DelegateDecompiler。它可以讓你在linq Select和Where語句中使用實體未映射的屬性和函數,這意味着它們是可重用的,並且被轉換爲SQL,因此我不需要在內存中獲取實體。這是鏈接,如果有人需要Link to DelegateDecompiler