我想在沒有實際編寫任何代碼的情況下評估NHibernate.LINQ 1.0。 Ayende承認this version of LINQ support is subpar compared to EF,但對我來說,我似乎無法找到解釋此實現中支持和不支持的頁面。例如,我可以使用Skip
& Take
?我不能使用什麼?NHibernate.LINQ支持的運算符
回答
您可以查看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的混合感到滿意。
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)
)。
非常好的答案,只是一個更正 - 你在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
Ayende的博客文章是從今年5月份開始的。很多事情都改變了。 NHiberante。 Linq 1.0 linq提供程序由於NHibernate Trunk中的新linq提供程序而被棄用,因爲大約一年。新的linq提供程序尚未完全完成,但已經非常完整並且可用於比舊的linq提供程序更多的功能。不適用於新linq提供程序的東西被認爲是bug,並且在報告的某一天將被解決。
您可以跳過並使用舊的和新的linq提供程序。已知問題的最新列表可在NHibernate Jira上找到。其他問題是未知的,所有其他功能已經被支持。
- 1. 類不支持運算符
- 2. []運算符不支持字符串
- 3. 類型''列表'不支持運算符'+'
- 4. '\'運算符不支持浮點數?
- 5. JavaScript是否支持<=運算符?
- 6. DynamicQueryable如何支持Array運算符?
- 7. 迭代器是否支持+運算符?
- 8. Solr是否支持搜索運算符?
- 9. LINQ:不支持查詢運算符'ElementAtOrDefault'
- 10. 是否dwscript支持運算符重載
- 11. Java是否支持運算符重載?
- 12. 查詢運算符'TakeWhile'不受支持
- 13. CQL支持哪些算術運算?
- 14. 檢查通用支持算術運算
- 15. Php7.1致命錯誤:[]運算符不支持字符串
- 16. Obscure「用於查詢運算符的不支持的過載'Where'。」
- 17. NHibernate.Linq與的CompareTo字符串
- 18. 是由合金支持的乘法和除法運算符嗎?
- 19. 如何使用Flask-Restless支持的查詢運算符「like」
- 20. Fiddler的QuickExe支持邏輯運算符嗎?
- 21. 不支持的重載用於查詢運算符'相交'
- 22. 支持數學運算符的標準python類?
- 23. 支持C中泛型類中的+運算符#
- 24. LastResultOperator結果運算符不是當前支持的
- 25. 不支持的過載用於查詢運算符'Distinct'
- 26. Haskell是否支持MongoDB的查詢運算符,比如「$ in」?
- 27. 那麼....是否支持Java運算符重載?
- 28. 在JDV中支持Oracle外連接運算符
- 29. Go是否支持運算符類型變量?
- 30. Rust是否支持使用中綴運算符作爲函數?
好答案+票!請注意,NHibernate中繼對於之前版本中實現的所有功能都是穩定的。這些問題是新功能中的一些舊問題和問題。 trunk中的linq提供者比另一個更穩定。許多人在已經運行的主要應用程序中使用該主幹。 – Paco 2010-09-23 21:56:45
穩定版似乎支持所有的聚合。例如我使用MAX,它會一直轉換到數據庫並在那裏執行。請注意,如果您使用VB.NET,則會出現字符串比較的小錯誤。我發現那很難。只需使用myStr.Equals(「foo」)而不是mystr =「foo」,它就可以正常工作。如果使用C#不是問題。 – Bytemaster 2010-09-23 21:58:08
@Paco:很高興知道。我會嘗試將我的一個應用程序移動到NH主幹,並查看它是如何工作的(當然,在測試環境中)。 – rebelliard 2010-09-24 17:20:13