2010-08-16 73 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") 
}