2010-08-16 43 views
3
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim ds As DataSet 
    ds = getData() 
    Dim dt As DataTable = ds.Tables(0) 
    Dim gridViewData = From r As DataRow In dt.Rows Select r.Item("foo"), r.Item("bar") 
    GridView1.DataSource = gridViewData 
    GridView1.DataBind() 
End Sub 

我刚刚写了前面的代码,并且得到了下面的编译时错误:“范围变量名称只能从简单的或没有参数的限定名称推断出来”。为什么我会得到这个错误?我如何修复我的代码?这个linq查询有什么问题?

回答

6

编辑:好的,我现在明白了这个问题。它在投影中。试试这个:

Dim gridViewData = From r As DataRow In dt.Rows _ 
        Select Foo = r.Item("foo"), Bar = r.Item("bar") 

基本上它不知道在投影中调用哪些属性。

+0

谢谢,但我得到同样的错误。 – 2010-08-16 14:45:12

+0

@米粉饼干:我已经更新了我的答案,现在我想我明白了。 – 2010-08-16 14:47:09

+0

@Jon看来VB.NET要求你明确表示属性名称。我很好奇,C#会从列名中推断属性名称,以便您不必在投影中定义它们? – 2010-08-16 14:50:12

2

不幸的是,我不知道这样做的VB语法,所以我就必须拿出C#和希望你能做得出来:

from DataRow r in dt.Rows 
select new 
{ 
    r.Item("Foo"), 
    r.Item("bar") 
} 

这是说:“创建一个新类有两个属性“,但它不知道你想要这些属性命名。如果你做了这样的事情:

from DataRow r in dt.Rows 
select new 
{ 
    r.Count, 
    r.NumRows 
} 

然后,它会认为你想叫CountNumRows属性,但你的,所有它去是Item,它被两个。

它解决这个问题,必须指定名称,明确:

from DataRow r in dt.Rows 
select new 
{ 
    Foo = r.Item("Foo"), 
    Bar = r.Item("bar") 
}