2012-03-28 63 views
0

我在懶惰加載時遇到了一個問題。爲此,我使用LinQ到NHibernate,但我認爲它也適用於其他LINQ to XX方法。最佳做法:延遲加載或獲取所有屬性

設想一個用戶 TABEL用柱:

ID 名稱 地址 密碼(在這個例子中:平紋,不散列)

然後想象一個角色表:

ID 名稱

和cour se,有多對多表UserRole(附加信息如CreateDate)。

如果你只想得到名特定用戶角色您可以通過渴望加載用下面的查詢實現這個目標的

var roles = session.Query<User>().FetchMany(u => u.UserRoles) 
           .ThenFetch(ur => ur.Role) 
           .Single(u => u.Id == userId) 
           .UserRoles.Select(ug => new { ug.Role.Name }); 

Lazy- loading

var roles = session.Query<User>().Single(u => u.Id == userId) 
           .UserRoles.Select(ug => new { ug.Role.Name }); 

該adva急切加載的竅門:每次只有1次調用時,不要對數據庫進行2次或3次調用 急切加載的缺點:即使您說您只希望返回名稱,查詢本身也會導致所有數據庫中所有包含的表的屬性(包括我們示例中的密碼等敏感信息),並且一旦進入代碼,它將僅過濾名稱。

任何人都可以提供一些建議,哪些是最佳做法?還是有沒有其他方式的急切加載而不加載所有的屬性。請不要使用存儲過程的建議。

由於提前,

彼得

回答

0

至於是否要使用延遲加載或渴望加載。這真的取決於你的用戶會更頻繁地做什麼。如果您的用戶最終會觸及您的地圖引用超過50%(*我不確定是否有一個好的百分比,但是讓我們一起去吧),那麼您應該以急切的加載方式進行。否則,你應該使用延遲加載。這個百分比應該可能會因負載引起的成本而有所不同。

但是,我會說大多數ORM的默認行爲(懶加載),除非你真的有問題。堅持KISS的第一個座右銘。 :)

這只是我的兩美分至少:)

+0

我明白你的願景。但是安全呢?如果 - 例如銀行賬戶號碼 - 從客戶端發送到客戶端,而客戶端實際上不需要它,這會有多危險?數據庫和客戶端之間的數據傳輸是不安全的,還是它? – user825887 2012-03-28 17:43:23