2009-08-11 28 views
1

我正在嘗試用LINQ提供程序替換正在使用LINQ查詢的多字段搜索頁面的Criteria查詢。但是,我遇到了一個記錄計數的問題,以便我可以實現分頁。我試圖實現 的結果,該結果等同於使用LINQ的Criteria API的CountDistinct投影生成的結果。有沒有辦法做到這一點? ()方法提供的Distinct()方法似乎不像我期望的那樣工作,並將「.Distinct()。Count()」附加到由字段分組的LINQ查詢的末尾。 (整數ID列)的不同計數似乎會返回這些值的非重複計數。NHibernate - 使用LINQ進行CountDistinct投影的等價

我可以提供我使用的代碼,如果需要的話,但由於有這麼多的字段,它是 相當長,所以我不想在不需要的時候擠佔帖子。

謝謝!

回答

2

我想出了一種方法來做到這一點,儘管它在所有情況下可能都不是最佳的。實際上,在LINQ查詢中做一個.Distinct()時,在沒有使用.Count()的情況下,在生成的SQL查詢中會產生「獨特」。如果我通過使用.Distinct()。ToList()枚舉查詢並在結果內存集合中使用.Count()方法,我會得到我想要的結果。

這不完全等同於我原來用Criteria查詢做的事情,因爲計數實際上是在應用程序代碼中完成的,並且必須將整個ID列表從DB發送到應用程序。不過,就我而言,鑑於少量不同的ID,我認爲它會起作用,並不會成爲性能瓶頸。

但是,我確實希望將來能夠實現真正的CountDistinct()LINQ操作。

+0

我剛碰到同樣的問題。這在我看來像是LINQ適配器生成錯誤的SQL的問題。我必須使用相同的解決方法,在對它執行Count()之前,用'ToList()'強制執行查詢評估。 – 2010-07-07 22:21:41

0

你可以嘗試選擇你想要的第一個不同的列。它看起來像這樣:Select(p => p.id).Distinct()。Count()。就目前而言,你正在區分整個對象,它將比較對象的引用而不是實際值。

+0

一個好主意,和我試過的一個。不幸的是,這似乎並不按我期望的方式工作。在我的情況中,表格中實際上有27個不同的ID,但是對於所有我已有的連接執行此操作會返回類似於47,000的ID。執行.Distinct()。Count()生成的查詢實際上並沒有「明確」的查詢。希望在未來版本中可以改變的東西。 – 2009-08-12 14:34:53