我正在使用一個彙編程序模式將LinqToEntity實體組裝到數據傳輸對象中,然後傳遞到客戶端層以供使用。該方法一直是將權利對象翻譯成簡化的平面對象,以提供特定於服務調用的信息。DTO和IQueryable:組裝和拆卸DTO
例如,
// Original Entity looks something like this
public class PersonEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int MotherId { get; set; }
public PersonEntity Mother { get; set; }
// lots of other properties
}
// Flattened DTO
public class PersonSummaryInfo
{
public int Id { get; set; }
public string FullName { get; set; }
public string MothersFullName { get; set; }
}
在本例中,彙編器將創建一個PersonSummaryInfo,構建過程的FullNames一部分。
我現在面臨一些第三方控件(Telerik ASP.NET MVC GridControl)的問題,其中控件設置爲基於其Model的屬性過濾(使用IQueryable)。有一種想法似乎是你有單層設計,並將你的數據庫實體直接抽入視圖,這是我無法忍受的。
試圖將它結合到我的邏輯中,GridControl綁定到我的DTO,而不是實體,這是很好的,直到它嘗試排序任何東西。我以非常通用的方式將所有IQueryable素材都推送到我的服務中,以便爲此負責。排序嘗試進行排序,在DTO上說MothersFullName(它的行爲是將「MothersFullName」作爲字符串傳遞給您的排序邏輯),這會被推送到我的服務,通過反射嘗試對實體進行排序,利用IQueryable懶惰加載,但當然執行查詢時,會拋出一個異常,因爲「MothersFullName」不是原始實體的屬性。
是否有一個很好的策略來處理這種實現?一旦它返回到應用程序的服務層,有效地將DTO「反彙編」回到它的ORM實體是否是好的做法?或者更好地傳遞更豐富的對象,知道它們是什麼(例如,如何使用FirstName和LastName對全名進行排序)?
什麼是關鍵,我的要求是:
- 使用花式Telerik的控制,因爲他們喜歡它的服務水平
- 懶負載的結果(即不帶靠背2萬條記錄,並只顯示10)
- 支持篩選,分頁等
- 健全的體系結構實現
我選擇了這個作爲我的案例的答案,但我也覺得sovanesyan的答案可能適用於其他類似問題的人。 – Arkiliknam