我在应用程序中有以下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)};
你确定数据(查询1)== Boreholes(查询2)? – hyp 2012-07-11 15:50:53
不,它们不一样,只是一个手动创建对象的假人,另一个是实际的SQLite数据库内容,因此这些类由LINQPad自动创建。问题是为什么操作被允许在'List'上,而不是在LINQPad访问的表上。 –
2012-07-11 15:56:58