2012-07-11 20 views
0

我在應用程序中有以下LINQ查詢。數據源是爲了測試目的在內存中構建的List<Borehole>在針對SQLite數據庫的LINQPad查詢中發生InvalidOperationException

var lq = from p in data 
     group p by p.CostCenter into g 
     select new { CostCenter = g.Key, 
         AverageDepth = g.Average(p => p.OriginalDepth), 
         NullDepthCount = g.Count(p => p.OriginalDepth == null) }; 

它運行完美,並給出所需的選擇結果。然而,當我在LINQPad運行下面的查詢,它導致InvalidOperationException

var lq = from p in Boreholes 
      group p by p.CostCenter into g 
      select new { CostCenter = g.Key, 
         AverageDepth = g.Average(p => p.OriginalDepth), 
         NullDepthCount = g.Count(p => p.OriginalDepth == null) }; 

這裏的數據源是使用IQ 2.0.5.0 LINQPad司機在一個SQLite數據庫中的表,掛LINQPad。該錯誤信息是:

No generic method 'Where' on type 'System.Linq.Queryable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.

我使用LINQPad v4.42.01。應用程序示例編譯爲.NET Framework 4 Client Profile

OriginalDepth屬性類型double?

爲什麼我的查詢不能在LINQPad中工作/爲什麼它在我的應用程序中工作?

我該如何解決LINQPad查詢問題?

UPDATE

如果我複製和粘貼我的應用程序代碼,包括虛擬Borehole類的定義和虛擬data列表的創建,爲LINQPad,它工作正常。因此問題不在於LINQPad拒絕適用於應用程序的查詢格式。

問題就變成:爲什麼我一個List<Borehole>對象使用g.Count(p => p.OriginalDepth == null),但是當我做對LINQPad訪問的SQLite表相同的查詢,我得到InvalidOperationException如上所述?

更新2

不要緊用於查詢的g.count部分謂語是什麼。在同樣的錯誤,當對SQLite數據庫表執行以下結果:

var lq2 = from p in Boreholes 
      group p by p.CostCenter into g 
      select new { NullDepthCount = g.Count(p => true)}; 
+0

你確定數據(查詢1)== Boreholes(查詢2)? – hyp 2012-07-11 15:50:53

+0

不,它們不一樣,只是一個手動創建對象的假人,另一個是實際的SQLite數據庫內容,因此這些類由LINQPad自動創建。問題是爲什麼操作被允許在'List '上,而不是在LINQPad訪問的表上。 – 2012-07-11 15:56:58

回答

3

並不是每個LINQ提供程序是要支持所有功能,因此想必你已經打一個這裏說的智商提供者不支持。

如果表的尺寸小(和SQLite數據庫通常是),那麼你可以做

var lq = from p in Boreholes.ToList() 
     group p by p.CostCenter into g 
     select new { CostCenter = g.Key, 
        AverageDepth = g.Average(p => p.OriginalDepth), 
        NullDepthCount = g.Count(p => p.OriginalDepth == null) }; 

顯然這將加載整個鑽孔表到內存中,因此查詢現在是一個Linq到對象查詢哪些工作。

更新。

它還看來,簡單地更換

NullDepthCount = g.Count(p => p.OriginalDepth == null) 

在原始查詢其

NullDepthCount = g.Where(p => p.OriginalDepth == null).Count() 

將工作,這意味着你不需要把數據到內存中。

+0

感謝您的回答,g.Where().Count())解決方法非常完美,如果我遇到類似的事情,我會記住'.ToList()'技巧。 – 2012-07-12 06:55:36