簡體   English   中英

有人可以更好地解釋 nHibernate 中的“投影”是什么嗎?

[英]Can someone better explain what 'Projections' are in nHibernate?

作為 nHibernate 及其實用程序庫 fluent nhibernate 的新用戶,我正在努力學習足夠多的知識,以至於使用一個好的數據庫是危險的。

我在理解Projections的概念時遇到了極大的困難。 具體來說,他們到底是什么?

我確實對“什么是預測? ”進行了精確搜索。 '和' nHibernate '和' nHibernate,Projections,Definition '等中的項目。我仍然很困惑。 到目前為止,最有幫助的帖子是This other StackOverflow QuestionColin Ramsay 的這篇博客文章 但我仍然非常困惑。 我對數據庫的了解充其量仍然是入門級的。

我真的不明白預測是什么,為什么要使用它們,它們正在完成什么等。我在博客文章中看到他正在使用它們來獲取整數列表(我假設是主鍵),以便他可以在不同的查詢中使用它們,但這在它的運作方式和原因方面有點模糊。

這是一個實際的例子。

假設您有一個在線商店,並且您的域類之一是“三星”之類的Brand 這個 class 有很多與之相關的屬性,可能是一個 integer Identity ,一個Name ,一個自由文本Description字段,對Vendor object 的引用,等等。

現在假設您要顯示一個菜單,其中列出了您的在線商店中提供的所有品牌。 如果你只做session.CreateCriteria<Brand>().List() ,那么你確實會得到所有的品牌。 但是你也會從數據庫中吸取所有長的Description字段和對Vendor的引用,並且你不需要它來顯示菜單; 你只需要NameIdentity 在性能方面,從數據庫中吸取所有這些額外的數據會減慢速度並且是不必要的。

相反,您可以創建一個“投影” object ,其中僅包含Identity和調用它的Name ,例如NameIdentityPair

public class NameIdentityPair
{
    public int Identity { get; set; }
    public string Name { get; set; }
}

你可以告訴 NHibernate 只告訴 select 你真正需要執行手頭任務的數據,告訴它把結果集轉換到你的投影上:

var brandProjections = this.session.CreateCriteria<Brand>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Name"), "Name")
        .Add(Projections.Property("Identity"), "Identity"))
    .SetResultTransformer(Transformers.AliasToBean<NameIdentityPair>())
    .List<NameIdentityPair>();

foreach (var brandProjection in brandProjections)
{
    Console.WriteLine(
        "Identity: {0}, Name: {1}", 
        brandProjection.Identity, 
        brandProjection.Name);
}

Now you don't have a list of Brand s but instead a list of NameIdentityPair s, and NHibernate will have only issued a SQL statement like SELECT b.Identity, b.Name from dbo.Brand b to obtain this projection, as opposed to一個龐大的 SQL 聲明,其中包含為Brand object 補水所需的一切(例如, SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v....

希望這可以幫助。

如果您熟悉 SQL,則投影是查詢的SELECT子句,用於 select 哪些字段從可用結果中返回。

例如,假設您有一個包含FirstNameLastNameAddressPhone字段的Person 如果您希望查詢返回所有內容,則可以省略投影,例如SELECT * FROM Person in SQL。 如果您只需要名字和姓氏,您可以使用FirstNameLastName創建一個投影——在 SQL 術語中,這將是SELECT FirstName, LastName FROM Person

您可以使用投影來調用 sql 函數,如 SUM、COUNT... 或 select 單個字段而不返回實體。

“...僅檢索一個或多個實體的屬性,而無需在事務性 scope 中加載實體本身的開銷。這有時稱為報告查詢;更正確地稱為投影。” [NHibernate 在行動]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM