3 回答

TA貢獻1831條經驗 獲得超4個贊
實體框架和引用對象的延遲加載是一種合理的方法。要擴展您的模型,請考慮以下事項。
創建一個鏈接 Employee 和 Skills 表的 SQL Server 視圖,并將其添加到 EF 模型中。視圖可以是您想要的最小或最大(例如,在對象 ID 中最小或在所有字段中最大)。
從此視圖中,選擇具有特定技能 ID 的所有記錄,您現在擁有所需的員工。由于視圖是在 SQL Server 中編譯的,因此它會盡可能快地完成。
您還可以在代碼中加入 Employee 和 Skill 對象并僅返回員工。在 LINQ 中,您可以查看為您的代碼生成的 SQL

TA貢獻1808條經驗 獲得超4個贊
我將嘗試給出更具體的答案,這些答案應該會給您提供實用的指導。
1)我應該在這個應用程序中有域對象嗎?
這取決于。對于非常簡單的應用程序,您不需要它。對于更復雜的應用程序,絕對推薦。
2) 我的 sql 查詢結果是否應該始終與域對象綁定?
是的,如果您要擁有域模型。如果您沒有域模型或者您試圖返回一個簡單的值(例如整數),則否。
3)如果我不使用域對象,那么我是否應該始終從數據訪問層返回自定義模型,其中包含我想要在我的 web api 服務中返回的所有內容?
如果您沒有域模型,那么您的 DAL 將成為 Web api 服務的直接仆人。因此,無論 web api 需要什么,它都需要從 DAL 中獲取。您可以一次性返回所有內容(一個方法調用),或者您可以通過多個方法調用讓 api 調用 DAL。顯然,一次性檢索所有內容更好,但這更適合服務層。DAL 應該一次返回聚合。但是如果沒有領域模型和更高級的方法,這可能是太多的考慮。
4)如果我使用域模型并且如果有一個場景我想顯示來自多個表的數據或這樣的場景
我會運行一個帶有連接的 SQL 查詢。然后我會遍歷行并從行創建父對象和子對象,然后我會以這種方式返回對象。事實上,這就是 Entity Framework 對導航屬性所做的事情——它使用 join 急切地加載整個結構。它不會執行多個查詢,如果您想將其優化到最大值,您也不應該執行。
如果您對我提到的任何事情有任何疑問,請告訴我。

TA貢獻1836條經驗 獲得超13個贊
1)我應該在這個應用程序中有域對象嗎?
只有你能回答這個問題;正確答案很大程度上取決于您對數據庫查詢結果的處理方式。如果您的 C# 代碼中有一些特定于字段的邏輯,則使用 DTO(POCO 實體類)是有意義的。但有時您可能只想執行一些查詢并以 JSON 形式返回結果,在這種情況下,DTO 可能會過大。
2) 我的 sql 查詢結果是否應該始終與域對象綁定?
不,這取決于你。您可以DbDataReader
直接使用來處理查詢結果,或將它們加載到DataTable
(或您的數據訪問庫可以提供的類似的更輕量級的結構)中。
3)如果我不使用域對象,那么我是否應該始終從數據訪問層返回自定義模型,其中包含我想要在我的 web api 服務中返回的所有內容?
如果您不使用 POCO 模型,您可以在代碼中編寫 JSON 并將其作為 ActionResult 返回。
4)如果我使用域模型并且如果有我想顯示來自多個表的數據的場景
如果您不使用像 EF 2 這樣的 ORM 可能的情況:
如果這是 2 個(或更多)連接表的結果:為此,您可以為此查詢結果添加特殊的 POCO 模型,或者使用像 DataTable 這樣的通用數據容器來處理結果
如果這是父子 (1-n):執行 2 個查詢并以 2 個 POCO 模型集合(例如,這些員工的集合)的形式獲取
List<Employee>
結果List<Skills>
。然后,如果您需要訪問具體的“父”實體的子實體,請使用 LINQ 執行額外的過濾。
如果您不想使用 EF 或 Dapper,您還可以查看我的庫,該庫可用于 POCO 模型或 DataTable 等通用結構(此外它還提供 RecordSet 結構)。
- 3 回答
- 0 關注
- 110 瀏覽
添加回答
舉報