我正在寻找一个在.net Framework 2.0中开始生效的解决方案,现在已经升级到Framework 4.0,所以我可能错过了某个地方所需的引用和/或Imports
行,我认为...
我的表单中有一个LINQ查询:
Dim x = Aggregate myDataRow As System.Data.DataRow In myDataTable _
Where (booleanCondition1) _
AndAlso (booleanCondition2) _
AndAlso (booleanCondition3) _
Into Count()
我收到编译错误“Definition of method 'Count' is not accessible in this context
”。
据我所知the literature,Count()函数应该可用(显然应该注册为关键字)。
我做错了什么?
编辑:
我刚刚将代码更改为一个直接的Select方法,如下所示:
Dim x = (From myDataRow As System.Data.DataRow In myDataTable _
Where (booleanCondition1) _
AndAlso (booleanCondition2) _
AndAlso (booleanCondition3) _
Select myDataRow)
当我尝试获取x的.Count
时,收到消息“'Count' is not a member of 'System.Data.EnumerableRowCollection(Of System.Data.DataRow)
”和according to the MSDN, it is。
现在完全糊涂了。
答案 0 :(得分:1)
首先,让我们看看EnumerableRowCollection(Of TRow)
,并注意Count
是一种扩展方法:
Count<TRow>()
已重载。返回序列中的元素数。 (由Enumerable
定义。)
Enumerable
本身就有这方面的信息:
命名空间: System.Linq
汇编: System.Core(在System.Core.dll中)
请注意,您始终可以在MSDN帮助中找到有关程序集和命名空间的信息。两者都很重要,并且不类型的命名空间与它所在的程序集之间的一一对应。
接下来,让我们看一下extension methods。不幸的是,它说:
通常,定义扩展方法的模块与调用它的模块不同。相反,如果需要,则导入包含扩展方法的模块,以将其带入范围
然后并没有真正详细说明模块在范围内意味着什么。它尽管提示在它的尽头:
当具有相同签名的两个扩展方法在范围内且可访问时,将调用具有更高优先级的扩展方法。扩展方法的优先级基于用于将方法纳入范围的机制。以下列表显示了从高到低的优先级层次结构。
在当前模块中定义的扩展方法。
在当前命名空间或其任何一个父节点中的数据类型内定义的扩展方法,子命名空间的优先级高于父命名空间。
在当前文件中的任何类型导入中定义的扩展方法。
在当前文件中的任何名称空间导入内定义的扩展方法。
在任何项目级类型导入中定义的扩展方法。
在任何项目级命名空间导入中定义的扩展方法。
由于前两个项目符号与您的情况无关,因此仅适用其余项目。他们都处理进口
Imports语句允许直接引用给定命名空间中包含的类型。
希望从以上所有内容中,您可以看到为什么对正确的程序集的引用本身不够,还需要添加导入。