2010-08-16 5 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

EDIT: Хорошо, я понимаю проблему сейчас. Это в проекции. Попробуйте следующее:

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

В принципе, он не знал, что назвать свойствами в проекции.

+0

Спасибо, но я получаю ту же ошибку. –

+0

@Rice Flour Cookies: я обновил свой ответ, теперь я думаю, что понимаю. –

+0

@Jon Кажется, VB.NET требует, чтобы экспликация выражала имена свойств. Мне любопытно, будет ли C# вызывать имена свойств из имен столбцов, чтобы вам не приходилось определять их в проекции? –

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 
} 

Тогда было бы предположить, что вы хотите свойства, называемые Count и NumRows, но с вашим, все это должно пойти на это Item, который используется обоими.

Это исправить это, необходимо указать имена, явным образом:

from DataRow r in dt.Rows 
select new 
{ 
    Foo = r.Item("Foo"), 
    Bar = r.Item("bar") 
} 
Смежные вопросы