2012-07-11 73 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