2014-02-27 41 views
1

我們正在使用DTOs服務器端,並且已經使用流利api配置了一個dbcontext,以便輕鬆呈現所需的元數據。我們將1:1映射到我們的真實數據庫實體,並且每個DTO包含真實數據庫實體屬性的簡單子集。在Breeze中使用DTO時的高效查詢

這很好,但現在我需要找出一種方法來提高查詢的效率 - 即如果Breeze客戶端查詢單個項目,我不想在創建之前創建一整套DTO對象過濾。即我想找出一種方法來執行過濾器/對實際實體進行排序,但仍返回DTO對象。

我想我需要找出一種方法來攔截查詢執行,以查詢我的真實數據庫實體並返回一個DTO而不是實際的數據庫實體。

任何想法如何最好的方法呢?

+0

「我想我需要找出一種方法來攔截查詢執行,以查詢我的真實數據庫實體並返回一個DTO而不是實際的數據庫實體。」我不明白你要做什麼 - 聽起來像你的服務器上你想要返回一個DTO而不是一個完整的實體 - 你試過在Breeze查詢中使用select語句嗎? –

+0

我可以做到這一點(而且),但是當我將這些實體公開爲IQueryable 屬性(使用在select中創建DTO的linq語句)時,會爲IQueryable可以過濾之前的每個實體創建一個DTO他們。即這裏的問題不是創建和填充DTO,而是能夠過濾而不必爲每個不匹配過濾器的實體創建DTO。 – fubaar

回答

0

原來,如果您在鏈接語句中使用投影,例如

From PossibleCustomer As Customer 
In Customers 
Select New CustomerDto With {.Id = PossibleCustomer.Id, 
          .Name = PossibleCustomer.Name, 
          .Email = PossibleCustomer.Email} 

..然後LINQ是足夠聰明,還是優化任何數據庫查詢 - 即如果我在LINQ查詢語句上面來過濾通過標識單個項目,該數據庫被擊中與查詢剛創建單個項目和單個DTO。非常聰明的東西。這隻適用於在linq語句中進行直接投影的情況 - 如果您調用某個函數來創建DTO,那麼這將不起作用。

爲防萬一其他人面臨相同的情況,您可能需要查看AutoMapper - 它可以使用您創建的模型爲您創建這些投影 - 避免所有那些難以閱讀和驗證的龐大linq語句。 automapper投影(假設你堅持簡單的東西)仍然允許linq實體魔術,以確保在創建DTO時不必進行表掃描。