2010-09-23 55 views

回答

18

您可以查看LINQ for NHibernate的示例,查看Ayende自己對已執行的內容和此提供程序不適用的內容進行的測試。

其中一些一般支持:

  • 匿名類型的創建。 new { Person = x.Name }
  • First()。 query.First()
  • FirstOrDefault()。 query.FirstOrDefault()
  • Single()。 query.Single()
  • SingleOrDefault()。 query.SingleOrDefault()
  • Aggregate()。 query.Aggregate((x1,x2) => x1)
  • Contains(). query.Where(x => x.Name.Contains("Foo"))
  • StartsWith()。
  • EndsWith()。
  • 子串()。 where db.Methods.Substring(e.FirstName, 1, 2) == "An"
  • 子查詢。 query.Where(x => x.Company.Id == 4)
  • Count()。 query.Where(x => x.Relatives.Count > 0)
  • Any()。query.Any()
  • Take()。 query.Take(10)
  • 跳過()。 query.Take(10).Skip(4)
  • OrderBy()。 orderby x.Name descending
  • 替換()。 AfterMethod = e.FirstName.Replace("An", "Zan"),
  • CharIndex()。 where db.Methods.CharIndex(e.FirstName, 'A') == 1
  • IndexOf()。 where e.FirstName.IndexOf("An") == 1

問題的:

  • 集團通過
  • 加入

一個我自己的例子:

query = NSession.Session.Linq<Catalog>() 
      .Where(acc => acc.Company.Status == "A") 
     .Where(acc => acc.Id.StartsWith("12-536")) 
     .Where(acc => acc.Id.EndsWith("92") || acc.Id.EndsWith("67")) 
     .Take(10).OrderBy(acc => acc.Title); 

如果你正在生產中的應用是採用最新穩定的構建2.1.2.4像我一樣,你是堅持NHibernate.Linq提供者給我們的東西,直到NHibernate 3.0(trunk)獲得一個穩定的版本,我們感到足夠安全,可以在主要應用程序中使用它。在那之前,我對NHibernate.Linq和HQL的混合感到滿意。

+1

好答案+票!請注意,NHibernate中繼對於之前版本中實現的所有功能都是穩定的。這些問題是新功能中的一些舊問題和問題。 trunk中的linq提供者比另一個更穩定。許多人在已經運行的主要應用程序中使用該主幹。 – Paco 2010-09-23 21:56:45

+0

穩定版似乎支持所有的聚合。例如我使用MAX,它會一直轉換到數據庫並在那裏執行。請注意,如果您使用VB.NET,則會出現字符串比較的小錯誤。我發現那很難。只需使用myStr.Equals(「foo」)而不是mystr =「foo」,它就可以正常工作。如果使用C#不是問題。 – Bytemaster 2010-09-23 21:58:08

+0

@Paco:很高興知道。我會嘗試將我的一個應用程序移動到NH主幹,並查看它是如何工作的(當然,在測試環境中)。 – rebelliard 2010-09-24 17:20:13

3

NHibernate是否可以使用Linq語句的基本測試是,您是否可以序列化該語句的表達式樹,然後在不同的過程中反序列化它並獲得正確的答案。這意味着沒有外部關閉; lambda必須僅與其創建的內容或作爲參數提供的內容一起工作。

Linq2NH 1.0,IIRC在使用未映射類的成員時也會扼流,因此,例如,如果您具有隻讀計算屬性(如特殊加權或滾動平均值),則必須將其映射到DB列以便在lambda中引用它(或重新創建lambda中的邏輯)。這是因爲表達式樹最終會被煮成SQL(通過NH的一箇中間體;在2.x中它是ICriteria,在3.x中它是HQL),如果NH不能接受一個表達式並將它轉換爲一個SQL表達,將評估成功,它只是不會工作。

有一種特殊情況:Linq2NH,IIRC,足夠聰明,可以將IList.Contains()表達式轉換爲IN子句。該列表必須在lambda中定義(如new[]{"1","2"}.Contains(m.ID))。

+0

非常好的答案,只是一個更正 - 你在3.x中通過HQL描述它的方式,它聽起來像你說LINQ查詢首先變成HQL字符串。 表達式樹會被解析回到HQL ANTLR解析器所指向的同一個AST中。這比定位字符串更有效;) http://blogs.imeta.co.uk/sstrong/archive/2009/02/22/617.aspx – 2010-09-24 08:22:58

3

Ayende的博客文章是從今年5月份開始的。很多事情都改變了。 NHiberante。 Linq 1.0 linq提供程序由於NHibernate Trunk中的新linq提供程序而被棄用,因爲大約一年。新的linq提供程序尚未完全完成,但已經非常完整並且可用於比舊的linq提供程序更多的功能。不適用於新linq提供程序的東西被認爲是bug,並且在報告的某一天將被解決。

您可以跳過並使用舊的和新的linq提供程序。已知問題的最新列表可在NHibernate Jira上找到。其他問題是未知的,所有其他功能已經被支持。